Verzeichnisausdrücke in JavaScript
Wir haben schon vordefinierte Verzeichnisse wie das Verzeichnis »this.Math« oder das globale Verzeichnis »this« kennengelernt.
Der Ausdruck »( {} )« steht in JavaScript für ein leeres Verzeichnis. Eigentlich steht schon der Ausdruck »{}« alleine für ein leeres Verzeichnis, doch wird eine Eingabe, die mit einer geschweiften Klammer auf »{« beginnt, von JavaScript manchmal auch noch als etwas anderes interpretiert. Um sicherzustellen, daß das Paar geschweifter Klammern als ein Verzeichnis »{}« interpretiert wird, muß diese Schreibweise an einer Stelle stehen, an der nur ein Ausdruck stehen darf, wie beispielsweise in runden Klammern »(« »)«.
Das folgende Beispiel zeigt den Wert des Eintrags »a« im Verzeichnis »( {} )«.
- Auswertung
( {} ).a
undefined
Da das Verzeichnis »( {} )« leer ist, ist der Wert des Eintrags »a« undefiniert.
Die Schreibweise »a: "b"« in den geschweiften Klammern eines Verzeichnisausdrucks besagt, daß der Schlüssel »a« den Wert »"b"« haben soll.
- Auswertung
( { a: "b" } ).a
"b"
Ein anderes Beispiel zeigt die Verwendung mit einer Zahl.
- Auswertung
( { i: 17 } ).i
17
Ein berechneter Name wird durch einen Ausdruck in eckigen Klammern angegeben, der eine Zeichenfolge ergibt.
Durch ein Komma getrennt können mehrere Einträge festgelegt werden.
- Auswertung
( { i: 17, a: "b" } ).i
17
- Auswertung
( { i: 17, a: "b" } ).a
"b"
- Auswertung
( { i: 17, a: "b" } )[ "i" ]
17
Ein Schlüssel muß ein Bezeichner, ein Zeichenfolgenliteral, ein numerisches Literal oder ein berechneter Name sein.
- Auswertung
( { a: 17, "b": 20, 2: 14, 2.5: 12, [ "a" + "b" ]: 7 } ).a
17
- Auswertung
( { a: 17, "b": 20, 2: 14, 2.5: 12, [ "a" + "b" ]: 7 } ).b
20
- Auswertung
( { a: 17, "b": 20, 2: 14, 2.5: 12, [ "a" + "b" ]: 7 } )[ 2 ]
14
- Auswertung
( { a: 17, "b": 20, 2: 14, 2.5: 12, [ "a" + "b" ]: 7 } ).ab
7
Zwei Verzeichnisse, die duch zwei Auswertungen eines Verzeichnisausdrucks entstehen, gelten immer als ungleich, selbst wenn die beiden ausgewerteten Ausdrücke gleich sind.
- Auswertung
( {} )===( {} )
false
Man erkennt verschiedene Parallelen zu den zuvor behandelten Funktionen: in beiden Fällen kann man einen Wert in einen komplizierteren Behälter einpacken und dann später wieder daraus entnehmen.
Zwei Ausdrücke, die beide ein Verzeichnis angeben, gelten nur dann als gleich (»===«), wenn beide das gleiche Verzeichnis angeben (in dem Sinne, daß eine Änderung des Verzeichnisses über den einen Ausdruck auch über den anderen Ausdruck erkennbar wird).
Objektliterale in Pfeilfunktionen
In »const cons =( car, cdr )=>( { car: car, cdr: cdr })« muß das Objektliteral eingeklammert werden, da es sonst als Verbundanweisung interpretiert wird.
»"use strict";«
Im strengen Modus von ECMAScript 5 wurden doppelte Schlüssel als Fehler erkannt. Seit ECMAScript 6 sind doppelte Schlüssel in einem Objektliteral aber kein Fehler mehr.
Übungsfragen
? Übungsfragen
Können Sie die Werte der folgenden Ausdrücke vorhersagen?
- Ausdruck
( { a: 2 } )===( { a: 2 } )
- Ausdruck
( { a: 2 } ).a
- Ausdruck
( { a: 2 } ).b
- Ausdruck
( { a: 2 } )[ "a" ]
- Ausdruck
( { a: 2, b: 3 } ).a
- Ausdruck
( { a: 2, b: 3 } ).b
- Ausdruck
( { a: 2, b: 3 } )[ "a" ]
- Ausdruck
( { a: 2, b: 3 } )[ "b" ]
- Ausdruck
( ( x )=>( { a: 2, b: 4 }[ x ] ))( "a" )
- Ausdruck
( ( x )=>( { a: x, b: 4 }.a ))( 2 )