A JavaScriptben az argumentumok és paraméterek kezelése alapvető szerepet játszik a funkciók működésében, és az ES2015 (más néven ES6) szabvány bevezetése új lehetőségeket kínált ezzel kapcsolatban. Az új funkciók, mint a "rest" (maradék) és az alapértelmezett paraméterek, jelentős mértékben leegyszerűsítették a kódot, és lehetővé tették a hatékonyabb programozást.

Amikor egy függvényt meghívunk, az argumentumok értékei a megfelelő paraméterekhez rendelődnek. Ha több argumentumot adunk meg, mint ahány paraméter létezik, a felesleges argumentumok nem lesznek hozzárendelve egyetlen paraméterhez sem. Például, ha egy practice("Yoshi", "sword", "shadow sword", "katana") hívást indítunk, az első három argumentum ("Yoshi", "sword", "shadow sword") megfelelően a ninja, weapon és technique paraméterekhez kerül. Az argumentumok listájában szereplő negyedik, "katana" érték viszont felesleges, és nem kerül hozzárendelésre. Ha viszont kevesebb argumentumot adunk meg, mint amennyi paraméter létezik, azok a paraméterek, amelyekhez nem tartozik argumentum, undefined értéket kapnak. Ez például akkor történik, ha a practice("Yoshi") hívásban csak egy argumentum szerepel: a ninja paraméter értéke "Yoshi" lesz, míg a weapon és technique paraméterek undefined értéket kapnak.

A régebbi JavaScript verziókban a paraméterek és argumentumok kezelésére különféle trükköket kellett alkalmazni, de az ES6 lehetőséget biztosít arra, hogy egyszerűbben és érthetőbben dolgozhassunk velük. A "rest" paraméterek és az alapértelmezett paraméterek mind új megoldásokat kínálnak erre.

Rest paraméterek

A "rest" paraméterek (azaz maradék paraméterek) lehetővé teszik számunkra, hogy a függvényekhez több argumentumot rendeljünk, anélkül hogy külön paramétereket kellene hozzájuk rendelni. Az új verziókban a maradék paraméterekhez az ellipszis (...) szimbólumot használjuk, ami egy tömbbe gyűjti a maradék argumentumokat. Az alábbi példában egy egyszerű függvényt készítünk, amely megszorozza az első paramétert a többi paraméter közül a legnagyobbal.

javascript
function multiMax(first, ...remainingNumbers) {
const sorted = remainingNumbers.sort((a, b) => b - a); return first * sorted[0]; }

Ebben az esetben a multiMax függvény négy argumentumot kap: multiMax(3, 1, 2, 3). Az első argumentum (3) az első paraméterhez (first) kerül, míg a többi érték a maradék paraméterek (remainingNumbers) tömbjébe kerül. Az értékek rendezése után a legnagyobb számot szorozzuk meg az első paraméterrel. Ez a megoldás sokkal egyszerűbb, mint a korábbi verziókban alkalmazott workaround-ok.

Fontos megjegyezni, hogy csak az utolsó paraméter lehet maradék paraméter, és ha próbálunk nem az utolsó paraméter előtt ellipszist használni, akkor szintaktikai hibát kapunk.

Alapértelmezett paraméterek

A másik új lehetőség az alapértelmezett paraméterek használata, amelyek egyszerűsítik a kódot, amikor az argumentumok hiányoznak. Az alapértelmezett értékek akkor kerülnek alkalmazásra, ha egy paraméter értéke nincs megadva a függvényhívásban. Ez a funkcionalitás különösen hasznos akkor, ha a felhasználó számára kényelmes és rugalmas alapértelmezett viselkedést szeretnénk biztosítani.

Például egy egyszerű performAction függvény esetén, ha az action paraméter nincs megadva, az alapértelmezett értéke a "skulking" lesz:

javascript
function performAction(ninja, action = "skulking") {
return ninja + " " + action; }

Ebben az esetben, ha az action argumentum nem szerepel a hívásban, akkor a "skulking" értéket fogja használni a program. Ha megadjuk az értéket, az alapértelmezett viselkedés felülíródik:

javascript
console.assert(performAction("Fuma") === "Fuma skulking", "The default value is used for Fuma"); console.assert(performAction("Yagyu", "sneaking") === "Yagyu sneaking", "Yagyu can do whatever he pleases, even sneak!");

Az alapértelmezett paraméterek lehetővé teszik a kód egyszerűbb és olvashatóbb megírását, mivel nem kell minden egyes függvényhívásnál ellenőrizni, hogy adottak-e az argumentumok, hanem ha azok nincsenek, akkor a megfelelő alapértelmezett értékek automatikusan alkalmazásra kerülnek.

Fontos megjegyezni, hogy az alapértelmezett értékek a balról jobbra értékelődés szabálya szerint működnek, így egy paraméter alapértelmezett értéke az előző paraméterek értékeitól függhet. Azonban ezt a megoldást óvatosan kell alkalmazni, mivel túlzott használat esetén csökkentheti a kód olvashatóságát.

Az alapértelmezett paraméterek segítenek elkerülni a null vagy undefined értékeket, és egyszerűsíthetik a különféle beállításokat, amelyek befolyásolják a funkciók működését. A modera használatuk egyszerűbbé és elegánsabbá teheti a kódot.

Hogyan kezelhetjük a JavaScript típusokat és javíthatjuk a kód teljesítményét?

A JavaScript világában gyakran találkozunk olyan eredményekkel, amelyek első ránézésre ellentmondásosnak tűnhetnek. Például, ha egy üres tömböt és egy üres objektumot összeadunk, az eredmény egy "[object Object]" string lesz, míg egy üres tömb és egy üres string összeadásakor üres stringet kapunk! Ahhoz, hogy JavaScript ninja legyél, nem szükséges az összes típuskonverziós szabályt kívülről tudnod, hanem inkább azt kell tudnod, hogyan kerülheted el őket. Az ilyen váratlan típusok gyakran okoznak hibákat a JavaScript kódban, és bárki, aki már látta az "undefined" szót egy weboldalon, tanúsíthatja, hogy meglehetősen frusztrálóak.

A probléma megoldására a Microsoft kifejlesztett és nyílt forráskódként elérhetővé tett egy eszközt, a TypeScript-et (https://www.typescriptlang.org). A TypeScript egy olyan nyelv, amely típus annotációkat ad a JavaScript-hez. A TypeScript fordító átvizsgálja a kódot, hogy megbizonyosodjon arról, hogy a típusok megfelelnek a szabályoknak. Például, ha egy számot váró függvénybe egy stringet adunk, akkor fordítási időben hibát kapunk, nem pedig futás közben, amikor a program rossz eredményt ad. Ez a kód például helytelenül működne:

typescript
const addOne = (x: number) => x + 1; addOne("10");

Ha engednék a futtatást, az eredmény "101" lenne, amitől biztosan elkerülhetnénk a váratlan eredményeket. A típus annotációk nemcsak a hibák megelőzésében segítenek, hanem egy gazdag információ réteget is adnak a kódhoz, amelyet különböző eszközök kihasználhatnak. Például, ha egy fejlett szerkesztőt, mint a VS Code-ot (https://code.visualstudio.com) használod, akkor közvetlenül a munka közben láthatod, hogy milyen típusú változók vannak a kódban, és mit várnak a függvények.

A TypeScript népszerűsége az elmúlt években ugrásszerűen megnövekedett. A 2023-as JavaScript állapotfelmérés (https://2023.stateofjs.com) szerint a fejlesztők több időt töltenek TypeScript kód írásával, mint JavaScript-tel. Minél népszerűbbé vált a TypeScript, annál inkább előnyös lett annak használata, mivel egyre több nyílt forrású könyvtár biztosít beépített típusinformációkat. A következő fejezetekben megmutatjuk, hogyan használhatod a TypeScript-et.

A kód minőségének javítására más eszközök is léteznek. Az egyik ilyen a linter, egy olyan eszköz, amely figyelmeztet, amikor egy problémás kódrészletet írsz. Az ESLint (https://eslint.org) a legismertebb JavaScript és TypeScript linter, amely erőteljes és nagy mértékben testre szabható. Az ESLint számos szabály alkalmazásával segíthet a hibák és a kódbeli anomáliák megelőzésében, például az "no-unreachable" szabály, amely figyelmeztet, ha kód található egy return vagy más elágazási pont után, vagy a "react/no-deprecated", amely elavult React függvények hívásakor lép működésbe.

Egy egyszerű linter szabály, amely segíthet a hibák elkerülésében, az "no-shadow" szabály, amely megakadályozza, hogy ugyanazt a változónevet használjuk egy olyan változó deklarálásakor, amely már létezik a külső scope-ban. Egy hiba például így nézne ki:

javascript
let username = "Zork"; function logInAs(username) { username = username; } logInAs("Grue");

Emellett a linterszabályok használhatók a kód stílusának érvényesítésére is. Ha például azt akarod, hogy az összes kommentár nagybetűvel kezdődjön, aktiválhatod a "capitalized-comments" szabályt. Az ilyen típusú stílusbeli szabályok gyakran rendelkeznek automatikus javító funkcióval, ami lehetővé teszi a kód automatikus módosítását.

A linterekhez hasonló eszköz a kódformázó, amely javítja a kód olvashatóságát azáltal, hogy a hosszú kódsorokat több sorra tördel, és egységes behúzási szabályokat alkalmaz. A legnépszerűbb kódformázó a Prettier (https://prettier.io), amely hatalmas időmegtakarítást jelent a fejlesztők számára. Ahelyett, hogy időt töltenél a kód kézi formázásával, vagy, ami még rosszabb, vitatkozva a kollégákkal a formázás mikéntjéről, a Prettier azonnal elvégzi a munkát. A következő fejezetekben bemutatjuk, hogyan használhatók az ESLint és Prettier.

A típusellenőrzés és a kódformázás rengeteg hibát kiszűrhet, de nem helyettesítik a tényleges kód futtatását. A tesztelési keretrendszerek segítenek annak biztosításában, hogy a kód úgy viselkedjen, ahogyan elvárnánk. A legfontosabb tesztek, amelyeket egy alkalmazásnak tartalmaznia kell, az egység tesztek és az end-to-end tesztek. Az egység teszt a kód viselkedését teszteli elszigetelten, míg az end-to-end teszt a rendszeren belüli interakciókat is figyelembe veszi, így segítve a valódi környezetekben felmerülő problémák felderítését.

A JavaScript kód tesztelése különösen fontos a valódi alkalmazások esetében, azonban a könyv példáiban az egyszerűsített megközelítést alkalmazzuk: a console.assert függvényt, amely alapértelmezetten elérhető minden JavaScript környezetben. Az ilyen tesztelési gyakorlatok segítenek elkerülni a gyakori hibákat és javítják a kód fenntarthatóságát és skálázhatóságát.

A JavaScript fejlesztők számára a legnagyobb kihívások között nemcsak a kódolás, hanem az alkalmazások teljesítménye is szerepel. Bár a JavaScript motorok idővel egyre gyorsabbak lettek, a JavaScript alapú weboldalak gyakran lassabbak, mint korábban. A lassú weboldalak negatívan befolyásolják a felhasználói élményt és a vállalatok bevételeit, hiszen a lassú oldalak hátrébb kerülnek a keresőmotorok rangsorában, és a felhasználók türelmetlenek lesznek, ha az oldal betöltése több másodpercet vesz igénybe.

A teljesítmény optimalizálása érdekében elengedhetetlen a kód bloat csökkentése, amely akkor keletkezik, ha túl sok JavaScript kódot küldünk a böngészőbe. A kód bloat problémája abban rejlik, hogy a fejlesztők hajlamosak a könnyebb megoldásokat választani, például külső könyvtárak hozzáadását, ahelyett hogy maguk írnák meg a szükséges kódot. Az ilyen gyakorlatok túlzott kódot generálhatnak, ami csökkenti az alkalmazás teljesítményét.