mozilla
Your Search Results

    Operátory

    Ačkoli ve specifikaci je tato část nazvána Expressions a dělena na sekce primary expressions, left-hand side expressions a dále podle operátorů, rozhodl jsem se ji sloučit a nazvat "Operátory", protože to dle mého názoru nejlépe vystihuje její podstatu.

    Operátor kvalifikovaného jména (::)

    Pro práci s jmennými prostory je zavedena dvojitá dvojtečka, jejíz použitím lze vyjádřit kvalifikovaného XML elementu nebo atribut. V části před dvojtečkami je buďto identifikátor proměnné typu Namespace, nebo speciální znak "*" zastupující jakýkoli jmenný prostor. V části za proměnnou může být budto přímo identifikátor, nebo výraz uzavřený v hranatých závorkách. Syntaxe s hranatými závorkami je užitečná především jako způsob zapsání jména XML elementu, které obsahuje znaky, které nemohou být částí JavaScriptového identifikátoru. Místo jména XML elementu může být opět zástupný znak "*", který je rovný jakémukoli jménu XML elementu.

    Příklady

    var ns = new Namespace("prefix", "url"); //způsob získání identifikátoru jmenného prostoru
    ns::elementName //jméno odpovídá XML zápisu "prefix:elementName"
    ns::["element-name"] //odpovídá "prefix:element-name"
    
    

    Operátor přístupu k atributu (@)

    Protože při přístupu k prvkům objektu XML je nutno rozlišit, zde se přistupuje k elementům nebo k atributům, byl zaveden "@" operátor. Zavináč uvedený před identifikátorem značí, že identifikátor slouží jako jméno atributu. "@" se může vyskytovat ve čtyřech formách:

    1. @ident, kde ident je libovolný identifikátor
    2. @QN, kde QN je kvalifikovaný identifikátor zapsaný za použití operátoru
    3. @Expression, kde Expression je libovolný výraz vracející řetězec nebo kvalifikované jméno
    4. @*, které se rovná libovolnému jménu atributu.

    Operátor výběru syna (., [])

    Standardní tečková notace slouží jednak pro volání metod na objektech XML a XMLList, tak i k přístupu k prvkům XML objektů. Standardní notace je object.member, popřípadě object.memberExpression. Uvažujeme, že object je typu XML nebo XMLList, jiné případy zůstávají nezměněny oproti nerozšířenému ECMAScriptu.

    V případě notace s hranatými závorkami jsou dva případy, které je nutno rozlišovat. Pokud je výsledkem vyhodnocení memberExpression číslicový index n , převede se member na typ XMLList, a výsledkem celého výrazu je n -tý prvek obsažený v objektu XMLList. Tato vlastnost záměrně stírá rozdíl mezi objekty XML a XMLList obsahující jediný objekt XML.

    Pokud výsledkem vyhodnocení memberExpression není číslicový index, a object je typu XML, je výsledkem celého výrazu XMLList obsahující ty prvky XML, jejichž jméno se rovná memberExpression. Pokud je object typu XMLList, je výsledkem výrazu XMLList, který je sloučením aplikování stejného operátoru na všechny jeho prvky.

    Tečková notace je totožná se závorkovou notací v druhém případě, tedy jsou vybírány prvky objektu XML, popřípadě slučovány výsledky aplikace operátoru na jednotlivé prvky objektu XMLList.

    Příklady

    var xml = <elem><item1>A</item1><item2>B</item2><item2>C</item2></elem>;
    xml[0]; //výsledek je totožný s objektem xml, z důvodu konverze na XMLList
    xml["item2"]; //výsledkem je XMLList obsahující dva elementy item2
    xml[*]; //výsledkem je XMLList obsahující element item a dva item2.
            //"*" se rovná jakémukoli jménu elementu
    xml.item1; //XMLList obsahující jeden prvek
    xml.*; //totožné s xml[*]
    var defaulNS = new Namespace("");
    xml.defaultNS::item1; //přístup přes kvalifikované jméno
    xml[defaultNS::item1]; //stejné jako předchozí případ
    
    

    Oproti "standardním" JavaScriptovým objektům mají metody i prvky XML objektů oddělené jmenné prostory. To je nejlépe vidět na příkladu:

    Operátor výběru potomka (..)

    Tento operátor je podobný standardnímu tečkovému operátoru. Výsledkem výrazu object..member je XMLList obsahující všechny prvky z XML podstromu, jejichž jméno se rovná member. member je buďto identifikátor, nebo kvalifikovane-jmeno kvalifikované jméno'.

    Příklady

    var xml = <elem>
    	<item1>
    		<item3/>
    
    		<x:item3 xmlns:x="xxx"/>
    	</item1>
    	<item2>B</item2>
    <elem/>;
    
    xml..item3;	//výsledkem je <item3/>
    try { xml..['item3']; } catch (e) {
    	alert("Toto je chyba. Závorkový výraz není ani identifkátor, ani kvalifikované jméno");
    }
    xml..*::['it'+'em3'];	//výsledkem je <item3/><x:item3 xmlns:x="xxx"/>.
    			//Takto lze obejít chybějící závorkovou notaci
    var ns = Namespace("", "");
    xml..ns::['item3'];	//výsledek je <item3/>
    
    			//přesnější způsob obejití chybějící závorkové notace
    

    Operátor filtru prvků

    Je operátor ve tvaru object.(expressions). object musí být buďto typu XMLList, nebo XML. Pokud je typu XML, je převeden na XMLList. Přes jednotlivé prvky XMLListu je iterováno a je jsou vráceny ty prvky, pro které nabývá výraz expression hodnoty true. Výraz je vyhodnocen, jakoby byl volán uvnitř with(item){} bloku.

    Pokud je tedy object typu XML, může být výsledkem výrazu XMLList obsahující buďto object nebo nic.

    Operátor delete

    Tímto unárním operátorem je možné odebírat prvky a atributy z XML objektu.

    Příklad

    var xml = <elem attribute='value'>
    	<item1/>
    	<item1/>
    	<item2/>
    	<item3/>
    <elem/>;
    
    delete xml.item2;     //smaže prvek item2 ze seznamu prvků
    delete xml.@attribute //smaže atribut
    delete xml.*[2];      //smaže třetí prvek
    delete xml.item1;     //obě item1 budou smazány
    
    
    

    Operátor typeof

    Unární operátor typeof zůstává nezměněn, pouze pro operand typu XML vrací "xml" a pro operand typu XMLList vrací "xmllist".

    Operátor plus (+)

    Pokud oba operandy typu XML nebo XMLList, je výsledkem XMLList obsahující sloučení převodu obou operandů na XMLList. Pokud je typu XML nebo XMLList jen jeden operand, použije se nerozšířeného chování operátoru +, tedy se operátory řetězcově spojí. Pokud je potřeba dosáhnout číselného sčítání, je nutné operandy explicitně přetypovat na číselný typ (například pomocí unárního +).

    Ve smyslu operátoru + je definován i operátor +=: variable += value je ekvivalentní variable = variable + value.

    Operátor rovnosti (==)

    Pro určení výsledku výrazu a == b platí tato pravidla (v tomto pořadí):

    • Objekt typu XMLList obsahující jeden prvek se rovná tomutu prvku.
    • Objekty typu XMLList se rovnají, mají-li stejné prvky.
    • Objekt typu XML s jednoduchým obsahem je roven svému textovému obsahu
    • Objekty typu XML se složeným obsahem se rovnají, pokud mají stejné jméno, prvky a atributy.
    • Objekty typu QName se rovnají, mají-li stejné vlastnosti uri a localName.
    • Objekty typu Namespace se rovnají, mají-ji stejné vlastnosti prefix a uri.

    Operátor přiřazení (=)

    V případě, že levá strana operátoru přiřazení je jméno atributu (uvozené operátorem atribut @), je daný atribut vytvořen či nahrazena jeho hodnota.

    V případě, že levá strana operátoru přiřazení je typ XML indexovaný pomocí číslicového indexu (např. xml3), je vyhozena vyjímka TypeError. Tento způsob je vyhrazen pro příští verze E4X.

    V případě, že levá strana je prvek objektu XML, je hodnota tohoto prvku po přiřazení rovna pravé straně. Tedy pokud levé straně vyhovuje více prvků, jsou nahrazeny všechny, pokud je pravá strana objekt typu XML, je prvek levé strany nahrazen tímto objektem, a pokud je pravá strana řetězec, je nastaven prvku levé strany textový obsah na tento řetězec.

     

    Informace o původním dokumentu

    • Autor: Jan Matoušek

     

    Document Tags and Contributors

    Contributors to this page: teoli, Pawell
    Last updated by: teoli,