Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 76
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 für den Eigenschaftszugriff wird manchmal als optionale Verkettung (Optional Chaining) bezeichnet, weil sie auch für längere, »verkettete« Ausdrücke für den Eigenschaftszugriff wie diesen funktioniert:
let a = { b: null };
a.b?.c.d // => undefined
a ist ein Objekt, also ist a.b ein gültiger Ausdruck für den Eigenschaftszugriff. Aber der Wert von a.b ist null, sodass a.b.c einen TypeError auslösen würde. Durch die Verwendung von ?. anstelle von . vermeiden wir diesen TypeError, und a.b?.c wird zu undefined ausgewertet. Das wiederum bedeutet, dass (a.b?.c).d einen TypeError auslöst, weil dieser Ausdruck versucht, auf eine Eigenschaft mit dem Wert undefined zuzugreifen. Aber – und das ist entscheidend bei der optionalen Verkettung – a.b?.c.d (ohne die Klammern) ergibt einfach undefined und löst keinen Fehler aus. Das liegt daran, dass der Zugriff auf Eigenschaften mit ?. vorzeitig unterbrochen wird (im Englischen wird dabei häufig von short-circuiting gesprochen, also »kurzschließen«): Wenn der Unterausdruck links von ?. zu null oder undefined ausgewertet wird, dann wird der gesamte Ausdruck sofort zu undefined ausgewertet, ohne dass überhaupt noch versucht wird, auf die nachfolgend angegebenen Eigenschaften zuzugreifen.
Wäre a.b ein Objekt und besäße dieses Objekt keine Eigenschaft namens c, würde a.b?.c.d natürlich wieder einen TypeError auslösen – und wir müssten einen weiteren bedingten Eigenschaftszugriff verwenden:
let a = { b: {} };
a.b?.c?.d // => undefined
Der bedingte Eigenschaftszugriff ist auch mit ?.[] anstelle von [] möglich. Wenn im Ausdruck a?.[b][c] der Wert von a gleich null oder undefined ist, wird der gesamte Ausdruck sofort zu undefined ausgewertet, ohne dass bei den Teilausdrücken b und c eine Auswertung überhaupt noch versucht wird. Weist einer dieser Ausdrücke Nebeneffekte auf, treten diese nicht auf, wenn a gar nicht definiert ist:
let a; // Hoppla, wir haben vergessen, diese Variable zu initialisieren!
let index = 0;
try {
a[index++]; // Löst einen TypeError aus.
} catch(e) {
index // => 1: Inkrementierung erfolgt, bevor der TypeError
// ausgelöst wird.
}
a?.[index++] // => undefined: weil a undefined ist.
index // => 1: Nicht erneut inkrementiert, weil ?.[] vorzeitig
// unterbrochen ("kurzgeschlossen") hat.
a[index++] // !TypeError: undefined kann nicht indiziert werden.
Der bedingte Eigenschaftszugriff mit ?. und ?.[] ist eine der neuesten Funktionen von JavaScript. Stand Anfang 2020 wird diese neue Syntax in den aktuellen oder Betaversionen der meisten gängigen Browser unterstützt.