A Javascript programozási nyelv

Utasítások, vezérlési szerkezetek

Értékadás

Az értékadást, a C-vonaltól átvett szintaxissal összhangban, "=" jellel jelöljük. Ugyancsak igazodva a C-s vonalhoz: az értékadás kifejezés, és írhatunk lánc-értékadásokat.

Destructuring assignment

Az 1.7-es verzióban került bevezetésre a destruktúrálható értékadás. A nyelv objektum-, és tömbliterálok létrehozására eddig is gyors, és egyszerű lehetőséget biztosított: objektumok esetében a "{ }", tömböknél pedig a "[ ]" jelek között lehet a tartalmat felsorolni, ami objektumoknál egy "property=érték" sorozat, tömbnél pedig az elemek sorozata. A destruktúrálható értékadás pont a fordított irányról, a tömbök, ill. objektumok gyors "szétszedéséről" szól. Leegyszerűsítve arról van szó, hogy az értékadás eredményére egy mintát illesztünk, melyben kikötjük, hogy az értékadás eredményének egyes részei hova tárolódjanak le. Ebben a konstrukcióban hatalmas lehetőségek rejlenek, melyeket az alábbi példák szemléltetnek.

Utasításblokk, címke

Utasításblokkok

Az utasításokat utasításblokkokba helyezhetjük. A blokkokat a "{" és "}" karakterek határolják. A blokkokat tetszőleges szinten egymásba ágyazhatjuk, mindegyik szinten tetszőleges számú utasítással. Viszont ezek a blokkok nem az említett programozási nyelvek blokkjainak megfelelőek, csupán az utasítások egy külön csoportját jelentik. Azaz egy belső blokkban deklarált változó a külső blokkban is hozzáférhető.

Címkék:

Címkéket használunk már az Assembly óta. Céljuk, hogy megnevezzünk egy utasítást. Természetesen önmagukban jelentéktelenek, csak vezérlésátadásnál használatosak.

label1: utasítás;

Elágazás

Egy-, illetve kétirányú elágazás

A nyelv egy és kétágú elágazáshoz az if-else szerkezetet használja. Az "if"-t a feltétel követi, amelynek logikai értéke van. Igaz érték esetén az azt követő utasításblokkot hajtja végre, hamis érték esetén az "else"-t követő blokkot. Természetesen else ágat nem kötelező írni, ekkor hamis érték esetén ugrik a következő utasításra. Ha csak egy utasítást akarunk írni az ágakba, akkor elhagyhatjuk a blokkosítást. A kifejezés természetesen tetszőlegesen összetett lehet, amit logikai vagy, illetve és operátorokkal kötünk össze.

if ( kifejezés ) { utasítások } else { utasítások }

Ha több ágat szeretnénk megadni több feltétellel, egymásba ágyazhatjuk az elágazásokat, ami annyit jelent, hogy az else-t egy újabb if követi. Ezt tetszőlegesen sokszor ismételhetjük. Például ha egy függvény eredményének három esete lehet:

var a = someFunction(b, c); if ( a <= 1) { document.print("You failed this course!"); } else if (a == 5 ) { document.print("You have mastered this course!"); } else { document.print("You passed this course!"); }

Többirányú elágazás

Természetesen az "if"-ek többszöri egymásba ágyazása eléggé elbonyolíthatja a szerkezetet, ezért ha több ágon szeretnénk egy feltételt vizsgálni, akkor azt többágú elágazással is megtehetjük, vagyis egy "switch"-el. A switch paramétereként szintén kifejezést kaphat, amely azonban nem csak logikai, de tetszőleges értéket vehet fel, és a különböző felvett értékek esetén külön programblokkokat futtathatunk. Az itt használatos programblokkok annyiban különböznek a megszokottaktól, hogy itt nem használunk "{" illetve "}" jeleket a blokkok azonosításához, ezt a "case" parancsok megteszik.
Amennyiben egyik érték (címke) sem felel meg a kifejezésnek, akkor írhatunk egy alapértelmezett (default) viselkedést, amely az if else ágának felel meg. Ezt nem kötelező megadnunk, ha egyik címkének sem feleltethető meg a kifejezés, és nincs default ág, a végrehajtás a switch utáni következő utasításnál folytatódik. Ha a kifejezés megfeleltethető egy címkének, akkor végrehajtódik a címke után található blokk, majd az összes azt követő blokk. Ha nem szeretnénk, hogy ez megtörténjen, akkor az egyes blokkok végére írhatunk egy "break" utasítást, amely ekkor kilép az elágazásból, és a switch után folytatja a végrehajtást.

switch (kifejezés) {
case címke_1: utasítások; break;
case címke_2: utasítások; break;
case címke_3: utasítások; break;
default: utasítások;
}

Például ha egy gyümölcsök árait szeretnénk megjeleníteni, akkor átadhatjuk az elágazásnak egy gyümölcsnevet paraméterként.

switch (expr) { case "Oranges": document.write("Oranges are $0.59 a pound."); break; case "Apples": document.write("Apples are $0.32 a pound."); break; case "Bananas": document.write("Bananas are $0.48 a pound."); break; case "Cherries": document.write("Cherries are $3.00 a pound."); break; default: document.write("Sorry, we are out of " + expr"."); }

Ciklus

Ciklusok esetében is a C nyelv szerkezeti elemeit vette át a JavaScript, és megtalálhatjuk a for, a do...while, illetve a while ciklust is. A ciklusmagok természetesen tetszőlegesen sok utasításból állhatnak, ekkor blokkba foglaljuk őket. A ciklusfeltétel minden esetben logikai kifejezés, vagy aritmetikai érték lehet. Utóbbi esetben a 0 érték jelenti a hamist, és minden más érték igazat.

While ciklus (A ciklus!)

Másképpen szokás elöltesztelős ciklusnak, vagy simán csak ciklusnak nevezni. A vezérlés először a feltétel ellenőrzését kapja meg. Amennyiben a feltétel teljesül, a ciklusmagban lévő utasítás (sorozat) hajtódik végre, majd a vezérlés ismét a feltétel ellenőrzéséhez kerül. Tehát az előltesztelő ciklusban a ciklusmagot csak akkor hajtja végre, ha a feltétel igaz, azaz lehetséges, hogy ez egyszer sem történik meg.

while ( feltétel ) { ciklusmag }

Természetesen minden ciklus esetében figyelnünk kell arra, hogy a feltétel valamikor hamissá váljon, különben végtelenségig futtatná a ciklusmagot. Szerencsére a kliensek ezt egyes esetekben felismerik, így csak hibaüzenetet kapunk. Például ha egy oldalra végtelenszer akarunk kiírni valamit, a kliens egy idő után leállítja a kiírást.

while (true) { document.print("Hello, world"); }
For ciklus

A szokványos for ciklus igazából az előltesztelő ciklus átfogalmazása, addig ismétli a ciklusmagot, amíg a feltétel igazzá nem válik. Működéséhez három paraméter kell, egy inicializálás, egy inkrementálás és egy ciklusfeltétel. Az inicializálásban megadhatunk egy, vagy több értékadást, amelyeket a későbbiekben ciklusváltozóként használunk. Az inkrementálásban ezen paraméterek értékét növelhetjük tetszőlegesen, azaz nem kell egyenként növelnünk a változót. A feltételben megadhatunk a ciklusváltozóra vonatkozó határt, vagy bármely más tetszőleges logikai feltételt.

for ( inicializálás, ciklusfeltétel, inkrementálás ) { ciklusmag }

A for teljes mértékben megfeleltethető egy while ciklusnak:

inicializálás
while ( ciklusfeltétel ) {
ciklusmag
inkrementálás
}

A for ciklus egy speciális fajtája, ha nem egy ciklusváltozó értékein, hanem egy objektum attribútumain lépkedünk végig. Ekkor az objektum minden attribútumát végigveszi, amelyekre számszerűen hivatkozhatunk, mintha tömbelemekre hivatkoznánk. A feltételben meg kell adnunk az objektumot, illetve, hogy milyen változóval szeretnénk végigiterálni. Például ha egy objektum változóinak nevét szeretnénk kiíratni:

function dump_props(obj, obj_name) { var result = ""; for (var i in obj) { result += obj_name + "." + i + "=" + obj[i] + "\n"; } return result; }

A Javascript 1.6-os verziója óta a for...in ciklus mellett megjelent a foreach...in ciklus is. Ez annyiban különbözik a for...in változattól, hogy a ciklusváltozó nem az objektum tulajdonságainak nevét, hanem értékét veszi fel. Például:

var sum = 0; var obj = {prop1: 5, prop2: 13, prop3: 8}; for each (var item in obj) { sum += item; } print(sum); // prints "26", which is 5+13+8
Do..while ciklus

A hátultesztelő ciklusban először lefut egy ciklusmag, majd ellenőriz egy ciklusfeltételt. Ha a feltétel igaz, akkor ismét lefuttatja a ciklusmagot. Tehát a mag egyszer mindenképpen lefut.

do { ciklusmag } while ( feltétel )

Például ha össze akarjuk adni a számokat 10-ig:

var c = 0; var sum = 0; do { c++; sum = sum + c; } while ( c <= 10 );

Vezérlésátadó utasítások

Break és continue

Még ha nem is biztosíthatjuk a ciklusfeltétel hamissá válását, elkerülhetjük a végtelen ciklusokat. A break utasítás, ahogy azt az elágazásoknál is láttuk, kilép a ciklusmagból, és a vezérlést átadja a következő utasításnak. Ha egy címke nevét írjuk a break után, akkor a vezérlés ahhoz a címkéhez adódik át.
Egy másik ciklusvezérlő utasítás a continue, melyet ciklusmagban megadva abbahagyja a ciklusmag végrehajtását, és a feltétel-kiértékeléshez adja át a vezérlést, tehát a következő ciklusban fogja folytatni a végrehajtást. Ezzel elérhetjük, hogy a ciklusmag egyes részei ne minden iterációban hajtódjanak végre. Itt is megadhatunk egy címkét az utasításnak, ekkor az adott címkénél folytatja a végrehajtást.

Egyéb utasítások

With utasítás

with(obj) statement, vagy with(obj) {...}

A statement, vagy a blokk részben leírt minősítés nélküli neveket először automatikusan az obj objektummal próbálja minősíteni. Például:

var a, x, y; var r = 10; with (Math) { // A blokk belsejében lévő függvényhívások a Math objektumon történnek. a = PI * r * r; x = r * cos(PI); y = r * sin(PI / 2); }