Megjelent az EcmaScript 5, vagyis a JavaScript, ActionScript programozási nyelvek mögött álló szabvány legújabb változata, melyet ebben a blogbejegyzésben én most simán lejavascriptezek. Az új változat még érettebbé teszi a JavaScript nyelvet a “strict mód” bevezetésével, illetve pár kisebb-nagyobb kiegészítést hoz be a használható függvények terén.

Az EcmaScript történetével úgy tűnik, hogy részben megismétlődik a CSS kapcsán már látott felállás: a korábbi EcmaScript 4 változatként kiadni tervezett (de ki nem adott) verziót végül csak az ActionScript valósította meg (pedig jó dolgok voltak benne), így az EcmaScript 5 végülis az EcmaScript 3 utódjaként jelenik meg. A JavaScript motorok világa azonban pörög, ott a legfiatalabb Google V8-a (Chrome), a Mozilla TraceMonkey-ja (Firefox), az Apple Nitroja (Safari), nem beszélve a többi böngészőben megjelent, vagy böngészőktől független futtatást lehetővé tevő motorról, tehát ideje volt egy kis ráncfelvarrásnak. Pár motor már támogatja is a megjelent újdonságokat.
Strict mód
A strict mód egy szigorúbb programozási stílust tesz lehetővé, kidobálva azokat a problémásabb részeket a nyelvből, melyek nem igazán váltak be, vagy egyszerűen túl lazák egy komoly programozási nyelvhez. A szigorúbb JavaScriptre a következő “paranccsal” lehet átállni:
"use strict";
Vegyük észre a megoldásba rejtett tökéletességet, vagyis hogy a parancs visszafele kompatibilis, a régebbi motorokban semmilyen hatása nem lesz az önmagában álló sztring literálnak. A teljes scriptünkben is használhatjuk a strict módot, de egy függvény elején megemlítve csak azon a függvényen belül is használható.
Az EcmaScript 5-öt támogató motorokban a következő fontosabb hatásokat váltja ki a “parancs”:
- A változókat használat előtt deklarálni kell a var paranccsal. Aki írt már nagyobb projekteket sok változóval, függvényekkel, és órákat debuggolta, hogy mi lehet a gond néhány furcsa hiba mögött, az tudja értékelni igazán ezt a változtatást. Egy függvényben ha nem használunk var-t, akkor a változó a globális névtérben jön létre, s ha mindezt két függvénynél is megtesszük, melyek pluszban még egymást is hivogatják, a végeredmény egy gyönyörű káosz lesz. Persze ez csak az egyik felállás, amikor gondot okozhat az, ha nem használjuk a var-t, s ezzel nem deklaráljuk, hogy az adott változó hol lesz elérhető. Jó gyakorlat volt eddig is mindig használni a var-t, ezentúl a JavaScript motor jelezni is tudja felénk, ha hibát vétünk.
- Az eval()-on keresztül futtatott kódrészlet elkülönített névtérben fut. Vagyis egy eval(“var x = 10;”); console.log(x); parancssor strict módban egy “undefined” értéket fog kijelezni számunkra. Az új x változó csak az evalon belül használható.
- Az oktális szám literálok (vagyis a nullával kezdődő számok, mint a 010) le lesznek tiltva. Eddig a var x = 010; után az x változó értéke 8 volt, strict módban viszont 10 lesz. Eddig sem használtam, ezentúl sem fogom az oktális számokat, egy hibalehetőséggel kevesebb.
- A with használata hibát fog eredményezni. A with használata az évek során nem vált be, a használata majd minden böngészőben lassú, és számos hibalehetőséghez is vezethet. A JavaScript programozók körében eddig is az volt a közvélekedés, hogy a with nem használandó.
- A delete parancs segítségével nem lehet ezentúl függvényeket, változókat, (függvény) paramétereket törölni. Pontosabban eddig sem lehetett, csak nem kaptunk hibaüzenetet, hanem csendben nem történt semmi.
- A függvényeknek nem lehet több ugyanolyan nevű paramétere, és az objektumok deklarációjakor sem fordulhat elő többször ugyanaz a kulcs.
- Az arguments ezentúl csak olvasható lesz. Az arguments helyi változó segítségével az aktuális függvény paramétereit érhettük el, s akár módosíthattuk is eddig, de ez nem volt egy túl szép megoldás.
Függvény környezet
Az EcmaScript új objektumokat, illetve metódusokat is hoz magával:
- A natív JSON támogatás talán az egyik legfontosabb újdonság. A JSON.parse() segítségével fel tudjuk dolgozni a JSON sztringet, a JSON.stringify() segítségével pedig egy objektumból készíthetünk JSON sztringet. Mind a két függvénynél kiszűrhetünk egyes kulcsokat egy második paraméterként definiált függvény segítségével.
- A függvény objektumok bind() metódusa segítségével ezentúl úgy hívhatjuk meg a függvényt, hogy a kontextust is definiáljuk. A lehetőség megegyezik a Prototype függvénykönyvtár által is definiált megoldással.
- A Date objektumok ezentúl feldolgozni és létrehozni (toISOString metódus) is tudnak ISO szabványú dátumokat (2009-12-12T12:12:12.000Z).
- A String objektumok kaptak egy trim() metódust.
- Az Array objektumok (vagyis a tömbök) egy halom új metódust kaptak: indexOf, lastIndexOf, every, some, forEach, map, filter, reduce, and reduceRight. Ezek többnyire eddig is jelen voltak így (natívan a böngészők által) vagy úgy (függvénykönyvtárak használatával), most már szabványosak is.
Objektum rendszer
Az EcmaScript 5 számos újdonságot hoz az objektumok és tulajdonságaik kezelését illetően is:
- Az Object.preventExtensions(obj) metódus letiltja az objektum bővíthetőségét (új tulajdonságok hozzáadását), az Object.isExtensible(obj) pedig lekérdezi, hogy bővíthető-e az adott objektum.
- Az objektumok különböző tulajdonságai új meta leírókkal bővülnek, az érték mellett az adott tulajdonság írhatósága (writable), felsorolhatósága (enumerable), módosíthatósága (configurable) is olvashatóak, illetve írhatóak. Ehhez kapunk egy adag új függvényt.
Összefoglalás
A Firefox újabb verziói, illetve az Internet Explorer 8 egy részét már támogatják az újdonságoknak, én a Firefox egy nightly verziójával kísérleteztem több-kevesebb sikerrel (például strict módban az oktális érték deklaráció nálam hibát dobott, nem pedig decimális számként értelmezte az értéket). Próbáltam a fentieket több forrásból is összeszedni, tesztelni, a szabvány PDF-je annyira száraz olvasmánynak bizonyult számomra, hogy inkább másodlagos forrásokból dolgoztam. Ezek miatt csúszhatott hiba is a fentiekbe, ha valaki talál valamit, szóljon!
John Resig alaposan összefoglalta a témát két bejegyzésében is, ezeket csak ajánlani tudom: ECMAScript 5 Objects and Properties és ECMAScript 5 Strict Mode, JSON, and More.
Éljen, éljen.
Az egyik legfontosabb kimaradt:
Tulajdonságok és leírók
A tulajdonságok teljes nagygenerálon estek át. Ezek után már nem csupán objektumhoz kötött adatok lesznek, hanem átvehetjük a teljes irányítást felettük, és azon, hogyan viselkedjenek. Ezzel a lehetőséggel viszont a komplexitás is növekszik.
Az objektum tulajdonságok két csoportra választhatók:
A tulajdonság lehet a következő két lehetséges …:
value: A tulajdonság értékét tartalmazza
Get: Függvény, ami akkor hívódik meg, amikor a tulajdonság értékét akarjuk lekérdezni
Set: Függvény, mely akkor hívódik meg, ha a tulajdonság értékét akarjuk beállítani
Továbbá a tulajdonságok lehetnek még:
Összességében ezek a különböző attribútumok szükségessé teszik a “property descriptor” (tulajdonság leíró) létrehozását.
Például egy egyszerű leíró a következőképp nézhet ki:
A három attribútum (writable, configurable, enumerable) opcionális, és alapállapotban true. Így az egyetlen attribútum,
aminek a property descriptorban szerepelnie kell az a “value” vagy egy Getter/Setter páros. (Az sajnos nem derült ki számomra,
hogy elég-e csak egy Getter vagy egy Setter, esetleg mindkettő szükséges)
Használhatjuk az Object.getOwnPropertyDescriptor metódust a tulajdonság attribútumainak lekérdezéséhez.
Object.getOwnPropertyDescriptor( obj, prop )
Ez az egyetlen lehetőség. Ez a metódus lehetővé teszi egy tulajdonság leírójának elérését (kiolvasását).
Az információk lekérdezésére (mivel ezek az információk nem elérhetőek a felhasználó számára, nem léteznek mint a tulajdonság
tulajdonságai, csak az EcmaScript motor tárolja őket)
Példa a használatra:
Object.defineProperty( obj, prop, desc )
A metódus használatával lehetővé válik új tulajdonság hozzáadása az objektumhoz (vagy egy létező tulajdonság leírójának módosítása)
A metódus egy property descriptort vár 3. paraméterként.
Example Usage:
Object.defineProperty az egyik legfontosabb metódus az EcmaScript új verziójában. Az összes nagyobb változtatás és újítás
ennek a metódusnak a létezését feltételezi.
Object.defineProperties( obj, props )
Egyszerre több tulajdonság definiálását teszi lehetővé egyszerre (ahelyett h egyenként kellene megadni)
Példa implementáció:
Példa a használatra:
Zak: Nem maradt ki (Objektum tulajdonságok rész), de valóban nem fejtettem ki. Nagyon köszönöm a kiegészítést, utólagos engedelmeddel kicsit megformáztam a hozzászólásodat!
OK, igazad van, nem jól fejeztem ki magam. Ha szükséges, nyugodtan illeszd be a bejegyzésbe, nem tartok igényt arra, h a nevem mellette legyen, én is fordítottam különböző helyekről.