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.
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.
A destruktúrálható értékadással lehetővé válik a nyelvben a szimultán értékadás!
Pl. Két változó értéke segédváltozó nélkül kicserélhető.
Ugyancsak lehetővé válik, hogy egy függvény több értéket adjon vissza. Például:
Valójában persze f egy tömböt ad vissza, viszont, mivel ezt a tömböt destruktúrálhatjuk, a hatás olyan, mintha f két értéket adna vissza. A tömb visszatérési értéket persze nem kötelező destruktúrálni, továbbra is megtehetjük azt, hogy egy tömbváltozóban tároljuk. Például:
A függvény által visszaadott értékek közül így akár az érdekteleneket (vagy mindet) el is hagyhatjuk: Például:
Iterálás objektum tulajdonságain és azok értékein egyszerre. Például:
Szelektálás objektum tulajdonságai közül.
A destruktúrálható értékadás objektumok esetén is használható. A legkézenfekvőbb
felhasználása ennek a mezők közötti szűrés, iteráció során. Például:
A kimenet:
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é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.
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:
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.
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.
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.
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:
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:
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:
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.
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: