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:
@ident
, kdeident
je libovolný identifikátor@QN
, kdeQN
je kvalifikovaný identifikátor zapsaný za použití operátoru@Expression
, kdeExpression
je libovolný výraz vracející řetězec nebo kvalifikované jméno@*
, 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
alocalName
. - Objekty typu Namespace se rovnají, mají-ji stejné vlastnosti
prefix
auri
.
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