JavaScript – Das Handbuch für die Praxis. David Flanagan
7.
Die Elementausdrücke in einem Array-Initialisierer können selbst auch wieder Array-Initialisierer sein, was bedeutet, dass mit solchen Ausdrücken verschachtelte Arrays erstellt werden können:
let matrix = [[1,2,3], [4,5,6], [7,8,9]];
Die Elementausdrücke in einem Array-Initialisierer werden jedes Mal ausgewertet, wenn der Array-Initialisierer ausgewertet wird. Das heißt, der Wert eines Array-Initialisierungsausdrucks kann bei jeder Auswertung anders lauten.
Undefinierte Elemente können in Array-Literale aufgenommen werden, indem zwischen zwei Kommata einfach kein Wert angegeben wird. Das folgende Array enthält beispielsweise fünf Elemente, von denen drei undefiniert sind:
let sparseArray = [1,,,,5];
Nach dem letzten Ausdruck in einem Array-Initialisierer ist ein nachstehendes Komma erlaubt, ohne dass dabei ein undefiniertes Element erstellt wird. Jeder Ausdruck zum Zugriff auf einen höheren Index als den des letzten Ausdrucks wird jedoch zwangsläufig zu undefined ausgewertet.
Objekt-Initialisierungsausdrücke ähneln Array-Initialisierungsausdrücken, stehen statt in eckigen aber in geschweiften Klammern. Außerdem werden jedem Teilausdruck innerhalb der Klammern ein Eigenschaftsname und ein Doppelpunkt vorangestellt:
letp={ x: 2.3, y: -1.2 }; // Ein Objekt mit 2 Eigenschaften.
let q = {}; // Ein leeres Objekt ohne Eigenschaften.
q.x = 2.3; q.y = -1.2; // Jetzt hat q die gleichen Eigenschaften wie p.
Ab ES6 haben Objektliterale eine wesentlich funktionsreichere Syntax (Details finden Sie in 6.10). Objektliterale können ebenfalls verschachtelt werden, zum Beispiel:
let rectangle = {
upperLeft: { x: 2, y: 2 },
lowerRight: { x: 4, y: 5 }
};
Objektliterale werden ausführlich in den Kapiteln 6 und 7 behandelt.
4.3Ausdrücke zur Funktionsdefinition
Ein Ausdruck zur Funktionsdefinition definiert eine JavaScript-Funktion, und der Wert eines solchen Ausdrucks ist die neu definierte Funktion. In gewisser Weise ist ein Funktionsdefinitionsausdruck ein »Funktionsliteral«, ähnlich wie ein Objektinitialisierer ein »Objektliteral« ist. Ein Funktionsdefinitionsausdruck besteht üblicherweise aus dem Schlüsselwort function, einer in runden Klammern folgenden optionalen durch Kommata getrennten Liste weiterer Identifier (der Parameternamen) und einem Block mit JavaScript-Code (dem Funktionskörper) in geschweiften Klammern, zum Beispiel:
// Diese Funktion liefert das Quadrat des übergebenen Werts.
let square = function(x) { return x * x; };
Ein Funktionsdefinitionsausdruck kann auch einen Namen für die Funktion enthalten. Funktionen können ebenfalls mit einer Funktionsanweisung statt eines Funktionsausdrucks definiert werden. Und in ES6 und später können Funktionsausdrücke eine kompakte neue Syntax verwenden, die mit sogenannten Pfeilfunktionen arbeitet. Alle Details zu Funktionsdefinitionen finden Sie in Kapitel 8.
4.4Ausdrücke für den Eigenschaftszugriff
Ein Ausdruck zum Eigenschaftszugriff bzw. ein Eigenschaftszugriffsausdruck wertet den Wert einer Objekteigenschaft oder eines Array-Elements aus. JavaScript definiert zwei Syntaxformen für den Eigenschaftszugriff:
Ausdruck . Identifier
Ausdruck [ Ausdruck ]
Bei der ersten Art des Eigenschaftszugriffs wird ein Ausdruck genutzt, auf den ein Punkt und dann ein Identifier folgen. Der Ausdruck gibt das Objekt an und der Identifier den Namen der gewünschten Eigenschaft. Bei der zweiten Art des Eigenschaftszugriffs folgt auf den ersten Ausdruck (das Objekt oder Array) ein weiterer Ausdruck in eckigen Klammern. Dieser zweite Ausdruck gibt den Namen der gewünschten Eigenschaft oder den Index des gewünschten Array-Elements an. Hier einige konkrete Beispiele:
let o = {x: 1, y: {z: 3}}; // Ein Beispielobjekt.
let a = [o, 4, [5, 6]]; // Ein Beispielarray, das das Objekt enthält.
o.x // => 1: Eigenschaft x des Ausdrucks o.
o.y.z // => 3: Eigenschaft z des Ausdrucks o.y.
o["x"] // => 1: Eigenschaft x des Objekts o.
a[1] // => 4: Das Element an Indexposition 1 des
// Ausdrucks a.
a[2]["1"] // => 6: Das Element an Indexposition 1 des
// Ausdrucks a[2].
a[0].x // => 1: Eigenschaft x des Ausdrucks a[0].
Bei beiden Arten des Eigenschaftszugriffs wird der Ausdruck vor dem . oder [ zuerst ausgewertet. Ist der Wert null oder undefined, löst der Eigenschaftszugriff einen TypeError aus, da diese beiden JavaScript-Werte keine Eigenschaften haben können. Folgen auf den Objektausdruck ein Punkt und ein Identifier, wird der Wert der dadurch benannten Eigenschaft nachgeschlagen und zum Wert des gesamten Ausdrucks. Folgt auf den Objektausdruck ein weiterer Ausdruck in eckigen Klammern, wird dieser zweite Ausdruck ausgewertet und in einen String umgewandelt. Der Wert des gesamten Ausdrucks ist dann der Wert der Eigenschaft mit dem durch den String angegebenen Namen. In beiden Fällen lautet der Wert des Eigenschaftszugriffsausdrucks undefined, wenn es die angegebene Eigenschaft nicht gibt.
Die Identifier-Syntax mit Punktnotation ist die einfachere der beiden Optionen für den Eigenschaftszugriff. Beachten Sie jedoch, dass sie nur eingesetzt werden kann, wenn die Eigenschaft, auf die Sie zugreifen wollen, einen zulässigen Identifier-Namen hat und Sie den Namen des Identifiers beim Schreiben des Programms bereits kennen. Wenn der Eigenschaftsname Leerzeichen oder Interpunktionszeichen enthält oder eine Zahl ist (bei Arrays), müssen Sie die Notation mit eckigen Klammern verwenden. Eckige Klammern werden auch genutzt, wenn der Eigenschaftsname nicht statisch, sondern selbst das Ergebnis einer Berechnung ist (ein Beispiel finden Sie in 6.3.1).
Objekte und ihre Eigenschaften werden ausführlich in Kapitel 6 behandelt, Arrays und ihre Elemente in Kapitel 7.
4.4.1Bedingter Zugriff auf Eigenschaften
Mit ES2020 sind zwei neue Möglichkeiten für den Eigenschaftszugriff hinzugekommen:
Ausdruck ?. Identifier
Ausdruck ?.[ Ausdruck ]
In JavaScript sind null und undefined die beiden einzigen eigenschaftslosen Werte. In einem regulären Ausdruck für den Eigenschaftszugriff mit . oder [] erhalten Sie einen TypeError, wenn der Ausdruck auf der linken Seite zu null oder undefined ausgewertet wird. Sie können aber ?. und ?.[] verwenden, um sich vor Fehlern dieser Art zu schützen.
Betrachten Sie den Ausdruck a?.b. Wenn a gleich null oder undefined ist, wird der Ausdruck zu undefined ausgewertet, ohne dass überhaupt versucht wird, auf die Eigenschaft b zuzugreifen. Wenn a einen anderen Wert hat, wird a?.b genauso wie sonst a.b ausgewertet (und wenn a keine Eigenschaft namens b hat, wird das Ergebnis undefined lauten).
Diese Form des Ausdrucks