A JavaScript dinamikusan tipizált nyelv. Ez azt jelenti, hogy nem kell deklaráláskor meghatározni egy változó adattípusát, és az adattípusok automatikusan konvertálódnak, ahogy az a script futása során szükséges. A JavaScript által megkülönböztetett adattípusok :
Adattípus neve | Informatív leírás |
---|---|
number | Szám változó, ami egyaránt tartalmazhat egész vagy valós számokat is. |
string | Karakterlánc változó. A konstansokat idézőjelek (") között adhatjuk meg, és használhatjuk a C-ben megszokott escape szekvenciákat is. |
boolean | Logikai változó. TRUE (igaz) vagy FALSE (hamis) értéket vehet fel. Ha számként használjuk, akkor a TRUE értéke 1, a FALSE értéke pedig 0 lesz. |
undefined | A változó létre lett hozva, de nem lett hozzárendelve érték. Arra vár, hogy értéket kapjon, és ekkor a típusa is megváltozik. |
null | Ez egy speciális adat, ami azt jelzi, hogy a változó nem tartalmaz semmit. Ha szövegként használjuk automatikusan átalakítja "null" értékké, ha számként, akkor 0-ává. |
function | Függvényváltozó. értéknek egy függvényt kaphat, amit akár meg is hívhatunk. |
object | Objektum változó, ami egy összetett adattípus. |
Egy változó típusát a typeof unáris operátor segítségével kérdezhetjük le, ami a fenti értékek valamelyikét tartalmazó karakterláncot adja vissza.
Számokat megadhatunk lebegőpontosként, illetve egész számként. A JavaScript három számrendszert használ:
Lebegőpontos esetben a szám három komponensből áll:
Logikai változó. TRUE (igaz) vagy FALSE (hamis) értéket vehet fel. Ha számként használjuk, akkor a TRUE értéke 1, a FALSE értéke pedig 0 lesz.
Lásd még: sztring literálok
A sztringek kétféleképp lehetnek jelen egy Javascript programban: literálként,
illetve String objektumként. Például:
A literálokra, és az objektumokra is használhatóak a String objektum függvényei. A különbség a két forma között az, hogy a literálokhoz nem lehet dinamikusan új tulajdonságokat rendelni. Ennek oka, hogy a literálon végzett bármely művelet során a háttérben egy temporális String objektum jön létre a literál tartalmával. A Javascript String objektumai immutable objektumok, azaz egy-egy objektumon nem végezhető módosítás, helyette a műveletek egy új, módosított objektumot adnak vissza. String objektumok többek, mint egyszerű karakter tömbök, de tömb módjára is indexelhetőek [] operatorral. Ez azonban csak a Mozilla alapú böngészőknél működik. Általánosan a charAt(...) függvény használható indexelésre. A immutable tulajdonság miatt hibának számít, ha egy String i. karakterének értéket próbálunk adni. Pl.
A Stringek összehasonlítására az "==" operátor használható, mely tartalom szerint hasonlít össze. Ez hossz szerint, ill. kis-, és nagy betű szerint is különbséget tesz. Stringek konkatenálására használhatóak a túlterhelt "+", és "+=" operátorok.
A nyelvben nincs explicit konstrukció felsorolási típusra, de szimulálhatóak objektum-literálokkal. Például:
Az elemi értékekből tömböket állíthatunk össze, és ahogy a változók esetében, a tömbök egyes elemeinek sincs meghatározott típusa, és ráadásul a tömb bármely eleme lehet tetszőleges típusú, azaz egy tömbben többféle típusú adat is előfordulhat. Tömböket az alábbi módokon hozhatunk létre:
Konstruktor hívással, opcionálisan a kezdő tömbméretet paraméterként átadva
Konstruktor hívással, a tömb elemeit paraméterként átadva
Tömbliterál létrehozásával, az elemeket "[" és "]" között felsorolva
Generátorok használatával ("Array comprehensions")
Lásd. még Generátorok c. rész.
A generátorok használatával a tömbinicializáció tömörebbé tehető. A szintaxis a tömbliterál létrehozásához hasonlít, de az elemeket nem mi soroljuk fel explicit, hanem egy speciális függvényt (a generátort) iterálva kapjuk (for each). A generátor által visszaadott értékeket egyenként transzformálhatjuk (a példában i*i), és szelektálhatjuk is (a második példában alkalmazott if-fel).
A tömb elemeire egyenként hivatkozhatunk, az elemek indexeivel (0,1,2 .. ), illetve hivatkozhatunk az egész tömbre egyszerre is a tömb nevével. Egy tömb hosszát, azaz elemeinek számát lekérdezhetjük a length propertyvel. A hagyományos értelemben nem kezeljük a tömb elemszámát, azaz egy három elemmel deklarált tömbnek lekérdezhetjük a 4. elemét is (3-as index), amely ekkor undefined lesz. Sőt a tömböt tetszőlegesen bővíthetjük is úgy, hogy egy olyan indexű elemének adunk értéket, amely eddig undefined volt. Ekkor az új indexet megelőző elemek, amelyeknek nem adtunk értéket, szintén undefined-ok lesznek. Például:
Továbbá létrehozhatunk úgy is tömböt, hogy nem minden elemének adunk meg értéket. Ha a definiáláskor kihagyunk elemek, akkor azok értéke szintén undefined lesz. Például:
A nyelvben nincsenek többdimenziós tömbök, helyettük a tömbök tömbje használható. Például:
A Javascript tömbjei, mivel méretük változhat, használhatóak lista adatszerkezetként is. A tömb azonban szinte minden más alapvető adatszerkezet szerepét képes eljátszani:
A tömbök indexelésére pozitív egészek helyett használhatunk Stringeket is. Ekkor használható a . operátor az egyes tömbelemek eléréséhez Például:
Innen már látható, hogy a háttérben valójában egy "a" nevű propertyt hoztunk létre a myArray objektumon a 100 értékkel, mely kétféle szintaxis szerint érhető el (vö. myArray.lenght == 0 !!). Ebből következően, mivel ezt bármilyen objektummal megtehetjük, bármilyen objektum használható asszociatív tömbként. Pl. (vö. "{ }" - objektum-literál a "[ ]" - tömb-literál helyett) Mégis a tömböket érdemes erre a célra használni, egyrészt az átláthatóság miatt, másrészt, a tömb objektum plusz szolgáltatásai (pl. a rendezésre: sort() függvény) miatt.
A tömbök rendelkeznek push(), és pop() műveletekkel, melyek a tömb végére tesznek be egy elemet, illetve vesznek el onnan. A verem többi jellemző művelete a tömb hosszának és az indexelésnek a használatával oldható meg.
A shift() függvény kilépteti az első elemet a tömbből, míg az unshift() belépteti a tömb elejére a tetszőleges számú paraméterét.
A tömb objektumokra használható függvények köre az 1.6-os verzióval jelentősen bővült. Az alábbi táblázat összefoglalja a régi és az új függvényeket: A Javascript verzió oszlopban, ha nincs külön jelölve verzió, akkor az 1.5-ös változatban használható a függvény. A böngésző verzió oszlopban az IE az Internet Explorer, a Moz a Mozilla, ill. az FF a Firefox verzióit jelöli.
Szignatúra | Leírás | Javascript ver. | Böngésző ver. |
---|---|---|---|
concat(value1[value2[value...]]) | Egyetlen tömbbé konkatenálja a paramétereket, melyek lehetnek tömbök, de egyszerű értékek is. | IE4, Moz 4.0 | |
every(function) | Ellenőrzi, hogy a paraméterként kapott, logikai értékű függvény a tömb összes elemére igaz-e. | 1.6 | ?, FF1.5 |
filter(function) | A paraméterül kapott függvényre igazat adó tömbelemeket tartalmazó új tömböt ad vissza. | 1.6 | ?, FF1.5 |
forEach(function) | A paraméterül kapott függvényt a tömb minden elemére végrehajtja. | 1.6 | ? FF1.5 |
join(delimeter) | A tömb elemeinek felsorolásából álló Stringet ad vissza, melyben az elemeket a paraméterül átadott delimiter választja el. | IE3.0, Moz 3.0 | |
indexOf(searchStr[, startIndex]) | Megkeresi a searchStr első előfordulását (opcionálisan a startIndextől kezdve) a tömbben. Ha nincs, az eredmény -1. | 1.6 | ?, FF1.5 |
lastIndexOf(searchStr[, startIndex]) | Az előzővel ellentétben az utolsó előfordulást keresi. | 1.6 | ?, FF1.5 |
map(function) | A paraméterül kapott transzformáló függvényt alkalmazza a tömb minden elemére, és a transzformált elemek tömbjével tér vissza. | 1.6 | ?, FF1.5 |
pop() | Eldobja a tömb utolsó elemét. | IE5.5, Moz 3.0 | |
push(value[,value2[, value...]]) | Hozzáfűzi a tömb végére a paramétereket. | IE5.5, Moz 4.0 | |
reverse() | Megfordítja a tömb elemeinek sorrendjét. | IE3.0, Moz 3.0 | |
shift() | Kilépteti a tömb első elemét a tömbből. | IE5.5, Moz 4.0 | |
slice([begin[, end]]) | Az egész tömbről, vagy a paraméterek által megadott indexhatárok közötti részről másolatot készít. | IE4.0, Moz 4.0 | |
some(function) | A paraméterül kapott függvényt addig alkalmazza a tömb elemeire, míg a függvény igazat nem ad. Ekkor a visszatérési érték igaz, egyébként hamis. | 1.6 | ?, FF1.5 |
sort([function]) | Paraméter nélkül alfabetikusan, paraméterrel az átadott rendező logika szerint rendezi a tömb elemeit. | IE3.0, Moz 3.0 | |
splice(start[, howmany[, element1[,element...]]]) | A start indextől kezdve howmany darab elemet töröl a tömbből, és egy, a törölt elemekből álló tömböt ad vissza. | IE5.5, Moz 4.0 | |
toSource() | A tömböt leíró forráskódot adja vissza. | -, FF1.5 | |
toString() | A tömb String reprezentációját állítja elő. (Sajnos az objektumokra csak "[object]"-et ír.) | IE3.0, Moz 3.0 | |
unshift(value1[, value2[, value...]]) | A tömb elejére belépteti a megadott paramétereket. | IE5.5, Moz 4.0 | |
Array.reduce(callback[, initialValue]) | Akkumulatív számítást végez a callback paraméterrel, és initialValue kezdőértékkel balról-jobbra haladva. | 1.8 | FF3.0 |
Array.reduceRight(callback[, initialValue]) | Mint a reduce, csak jobbról-balra halad. | 1.8 | FF3.0 |
A tömbök referencia szerint adódnak át. Az érték szerinti átadás szimulálására használhatjuk a slice() függvényt, ami egy másolatot készít az egész tömbről.
A nyelvben lehetőségünk van rekordok kezelésére is, ahol az elemekhez csak a beállított azonosító (kulcs) alapján hivatkozhatunk. A benne található elemek lehetnek objektumok, függvények, változók, elemi értékek, vagy akár más objektumtömbök is. A deklarálás itt is az elemek felsorolásával történik, amit "{" és "}" közé helyezünk, az elemeknél először az azonosítót, majd az értéket adjuk meg. Itt a téves kulccsal történő hivatkozás már nem undefined értékhez vezet, hanem hibához. Egy érdekes megközelítés, hogy amennyiben ez a kulcs egy pozitív egész szám, akkor használhatjuk a szokványos tömböknél használt indexszel való elérést, sőt, csak ilyen módon érhetjük el az adott értéket. Például:
Rekordokba beágyazhatunk más rekordokat is, és rekurzívan folytatva tetszőlegesen mély szinteket hozhatunk létre.
A JavaScript dinamikusan tipizált nyelv. Ez azt jelenti, hogy nem kell deklaráláskor meghatározni egy változó adattípusát, és az adattípusok automatikusan konvertálódnak, ahogy az a script futása során szükséges. Ha egy változót olyan helyen használunk, ahol a típusa nem megfelelő, a JavaScript automatikusan megpróbálja (ami néha igen szélsőséges helyzetekben is sikerül neki) a megfelelő típusra konvertálni. A leggyakrabban a számok és a karakterláncok között fordul elő.
A változókat a láthatóság szempontjából két csoportba oszthatjuk. Globálisak vagy lokálisak. A Javascript 1.7-es
verziója óta lokális változóról kétféle értelemben beszélhetünk: függvény szintű lokális (var kulcsszóval deklarált), illetve
blokk szinten lokális (let kulcsszóval deklarált) (lásd. még Változók hatóköre).
(A korábbi verziókban lokális változó létrehozására csak a függvény szintjén lokális deklarációval volt lehetőség a
Egy változót többször is deklarálhatunk, hiszen ez a nyelv számára nem jelent többet egy értékadásnál. Ha még nem adtunk értéket a változónak,
és var nélkül deklaráltuk, kiértékelésének eredménye futási idejű hibát fog kiváltani, míg ha használtunk var
kulcsszót, az eredmény undefined érték lesz, amely logikai műveletben hamisat jelent. Ha pedig egy változónak a null
értéket adtuk, akkor szöveges műveletben "null" szövegként, számításban nulla értékként helyettesítődik be.
Az undefined értéket használhatjuk például arra is, hogy megállapítsuk, egy változó kapott-e már értéket.
Ebben a példában az a és a b egyaránt globális változók. Az egyes függvényeken belül a következo változókat lehet elérni:
main() | someFunction() |
---|---|
a, b, d | a, b, c, e |
Az is lehetséges (bár nem ajánlott), hogy ugyanaz legyen egy lokális és egy globális változónak is a neve. Ebben az esetben a globális
változóra mint a global objektum egy property-jére hivatkozhatunk (global.változónév), a név egyszerűen leírva a lokális változóra fog
hivatkozni.
Amennyiben nem használtunk var kulcsszót, lehetőségünk van a változó törlésére is a delete operátorral. Kiadása után az adott változó
már nem elérhető. Például:
Változónév lehet betűvel, aláhúzással (_), vagy dollár jellel ($) kezdődő karaktersorozat, mely ezeken kívül tartalmazhat számokat is a
későbbi karaketerekben. Mivel a nyelv ügyel a kis- és nagybetűkre, használhatjuk ugyanazon neveket ezek variálása mellett, például az
"A110" és az "a110" két külön változónak a neve.
A JavaScript 1.3-tól a nyelv kódolása Unicode karakterkészletet használ, ezért ennek a szabványnak megfelelően használhatunk ékezetes
betűket is a változónevekben, akárcsak a Javaban.
A következő szavaknak speciális jelentése van az értelmező számára, ezért nem alkalmazhatjuk őket változóneveknek.
break | case | catch | class | const |
continue | debugger | default | delete | do |
else | enum | export | extends | false |
finally | for | function | if | import |
in | new | null | return | super |
switch | this | throw | true | try |
typeof | while | with | var | void |
Ha egy változó azonosítót függvényen kívüli hozzárendeléssel állítunk be, akkor azt globális változónak hívjuk, mert az aktuális dokumentumból
bárhonnan elérhető. Ha egy változót egy függvényen belül deklarálunk, azt helyi változónak nevezzük, mert csak az adott függvényen
belül érhető el.
A var kulcsszó használata globális változó deklarálásakor opcionális. Viszont, használnunk kell a var kulcsszót
változó függvényen belüli deklarálásakor.
A nyelv 1.7-es verziója óta a let kulcsszóval is deklarálhatóak változók, melyek blokk szinten lesznek lokálisak. A let kulcsszó többféleképp
használható:
A let kulcsszó után kezdőérték-adásokkal felsorolhatunk nulla, vagy több (akár a jelenlegi hatókörben lévőket elfedő) változót, melyek az ez után következő blokkban lokálisak lesznek.Például:
Az output :
Az előző lehetőség egyszerűsített változata, melyben nem egy blokk áll a let deklarációk után, csak egyetlen kifejezés. Ilyenkor eköré implicit odaértendő a blokk kapcsos zárójel párja. Például az előbbi példa egyszerűbben:
Az output természetesen ugyanaz, mint az előbbi példában.
Egy, a let definíciót tartalmazó blokkon belül hoz létre új, lokális változót. Abban különbözik a var kulcsszóval történő deklarációtól, hogy a var esetében a változó hatóköre az egész függvény, míg a let esetében csak az őt tartalmazó blokk. Ez a különbség ott figyelhető meg, hogy ha például egy függvényen belül egy ciklus magjában let definíciót használunk, akkor a ciklusból kilépve, de még ugyanabban a függvényben, a változót már nem tudjuk elérni. Például:
A let definíció használata globális környezetben értelmetlen, nem definiál globális változót. A let definíció használható for, ill. for...in ciklus ciklusváltozójának deklarálására, a változó hatásköre a ciklusmag lesz.
Egy ablakon vagy kereten belül deklarált változó más ablakból vagy keretből történő eléréséhez meg kell adni az ablak vagy keret nevét. Például, ha a phoneNumber változót egy FRAMESET dokumentumban deklaráltuk, akkor a változóra egy gyermek keretből parent.phoneNumber módon hivatkozhatunk.
A JavaScript 1.5-től lehetőségünk van konstans változók megadására is, amelyek értékét nem módosíthatjuk a szkript lefutása során. A konstansok esetében a const kulcsszót kell használnunk, nevének pedig ugyanazon feltételeknek kell eleget tennie, mint a változóknak. Konstansokat deklarálhatunk alprogramon belül és kívül is, a kívül deklaráltak globálisan elérhetőek. Például:
A kifejezés literálok, változók, operátorok és utasítások kombinációja, amely kiértékelése egyetlen értéket eredményez.
A JavaScriptben az alábbi kifejezések találhatók:
A JavaScript operátorai nagyrészt megfelelnek a C, illetve Java nyelvekben használatos operátoroknak, és meghatározott precedenciasorrenddel rendelkeznek. Az operátorok csoportosítása: