Kiadták az EcmaScript 5-öt

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.

docwriteisevil

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.

4 thoughts on “Kiadták az EcmaScript 5-öt

  1. Zak

    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 …:

    • Egy érték (egy adat tulajdonság – ez a hagyományos “érték”, amit ismerünk és szeretünk az ECMAScript 3-ból)
    • egy Getter és Setter metódus (“Accessor” tulajdonság, ami néhány modern böngészőből ismert, mint pl. a Gecko vagy a WebKit)

    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:

    • Writable. Ha false, akkor a tulajdonság értéke nem változtatható meg.
    • Configurable. Ha false, akkor bármilyen törlésre vagy attribútum változtatásra (Writable, Configurable, Enumerable) tett kísérlet sikertelen lesz (kivételdobás történik).
    • Enumerable. Ha igaz, akkor a for (var prop in obj) {} vagy hasonló utasításban megjelenik

    Ö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:

    {
    	value: "test",
    	writable: true,
    	configurable: true,
    	enumerable: true
    }

    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:

    var obj = { foo: "test" };
     
    console.log(JSON.stringify(
    	Object.getOwnPropertyDescriptor( obj, "foo" )
    ));
    // {"value": "test", "writable": true,
    //  "enumerable": true, "configurable": true}

    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:

    var obj = {};
     
    Object.defineProperty( obj, "value", {
      value: true,
      writable: false,
      enumerable: true,
      configurable: true
    });
     
    (function(){
      var name = "John";
     
      Object.defineProperty( obj, "name", {
        get: function(){ return name; },
        set: function(value){ name = value; }
      });
    })();
     
    console.log( obj.value )
    // true
     
    console.log( obj.name );
    // John
     
    obj.name = "Ted";
    console.log( obj.name );
    // Ted
     
    for ( var prop in obj ) {
      console.log( prop );
    }
    // value
    // name
     
    obj.value = false; // Exception if in strict mode
     
    Object.defineProperty( obj, "value", {
      writable: true,
      configurable: false
    });
     
    obj.value = false;
    console.log( obj.value );
    // false
     
    delete obj.value; // Exception

    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ó:

    Object.defineProperties = function( obj, props ) {
      for ( var prop in props ) {
        Object.defineProperty( obj, prop, props[prop] );
      }
    };

    Példa a használatra:

    var obj = {};
     
    Object.defineProperties(obj, {
      "value": {
        value: true,
        writable: false
      },
      "name": {
        value: "John",
        writable: false
      }
    });
  2. Bártházi András Post author

    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!

  3. Zak

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>