Читать книгу JavaScript für Ungeduldige - Cay Horstmann - Страница 76
2.7Boolesche Operatoren
ОглавлениеIn JavaScript gibt es drei Operatoren, um boolesche Werte zu kombinieren:
&& | und |
|| | oder |
! | nicht |
Der Ausdruck x && y ist true, wenn sowohl x als auch y zu true ausgewertet werden. x || y ist true, wenn mindestens x oder y zu true ausgewertet wird. Der Ausdruck !x ist true, wenn x false ist.
Die Operatoren && und || werden träge ausgewertet (Lazy Evaluation). Wenn bereits der linke Operand das Ergebnis eindeutig bestimmt (wenn es sich bei && um einen Falsy- oder bei || um einen Truthy-Wert handelt), wird der rechte Operand nicht mehr ausgewertet. Das kann sehr praktisch sein, wie das folgende Beispiel zeigt:
if (i < a.length && a[i] > 0) // a[i] > 0 wird nicht ausgewertet, wenn
// i ≥ a.length
Die Operatoren && und || zeigen noch ein anderes merkwürdiges Verhalten, wenn die Operanden keine booleschen Werte sind. In diesem Fall wird einer der beiden Operanden als Wert des Ausdrucks herangezogen. Entscheidet der linke Operand das Ergebnis, so ist er der Wert des Ausdrucks. Der rechte Operand wird dann nicht mehr ausgewertet. Anderenfalls ist der Wert des Ausdrucks der Wert des rechten Operanden.
Betrachten Sie dazu die folgenden Beispiele:
0 && 'Harry' // 0
0 || 'Harry' // 'Harry'
In dem Versuch, dieses Verhalten auszunutzen, schreiben manche Programmierer Code wie den folgenden:
let result = arg && arg.someMethod()
Damit soll vor dem Aufruf der Methode sichergestellt werden, dass arg nicht undefined oder null ist. Wenn das der Fall wäre, so hätte auch result den Wert undefined oder null. Allerdings versagt diese Technik, wenn arg ein leerer String, 0 oder false ist.
Eine weitere Anwendung besteht darin, einen Standardwert bereitzustellen, wenn eine Methode undefined oder null zurückgibt:
let result = arg.someMethod() || defaultValue
Auch das funktioniert aber nicht mehr, wenn die Methode 0, einen leeren String oder false zurückgeben kann.
Für solche Fälle wäre eine komfortable Möglichkeit praktisch, um einen Wert nur dann zu verwenden, wenn er nicht undefined oder null ist. Zwei Operatoren für diesen Zweck sind zurzeit (Anfang 2020) noch Vorschläge der Stufe 3, was bedeutet, dass sie wahrscheinlich in spätere Versionen von JavaScript aufgenommen werden.
Der Ausdruck x ?? y gibt x zurück, wenn x nicht undefined oder null ist, und anderenfalls y. In dem folgenden Ausdruck wird der Standardwert defaultValue nur dann verwendet, wenn die Methode undefined oder null zurückgibt:
let result = arg.someMethod() ?? defaultValue
Der Ausdruck x?.Eigenschaftsname ergibt die genannte Eigenschaft, wenn x nicht undefined oder null ist, und anderenfalls undefined. Betrachten Sie dazu folgendes Beispiel:
let recipient = person?.name
Wenn person weder undefined noch null ist, dann ist die rechte Seite genau gleichwertig mit person.name. Ist person dagegen undefined oder null, wird recipient auf undefined gesetzt. Hätten Sie in diesem Fall den Operator . statt ?. verwendet, wäre eine Exception aufgetreten.
Sie können ?.-Operatoren auch verketten:
let recipientLength = person?.name?.length
Wenn person oder person.name zu undefined oder null ausgewertet wird, wird recipientLength auf undefined gesetzt.