Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

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

 

Štítky a přispěvatelé do dokumentace

 Přispěvatelé této stránky: teoli, Pawell
 Poslední aktualizace od: teoli,