? :)x && y), Oder (x || y)x && y)||)!)Der primitive Typ boolean umfasst zwei Werte – false und true
> typeof false
'boolean'
> typeof true
'boolean' Die Bedeutung von „Konvertierung in [Typ]“
„Konvertierung in [Typ]“ ist eine Abkürzung für „Konvertierung beliebiger Werte in Werte vom Typ [Typ]“.
Dies sind drei Möglichkeiten, wie Sie einen beliebigen Wert x in einen Boolean konvertieren können.
Boolean(x)
Am aussagekräftigsten; empfohlen.
x ? true : false
Verwendet den Bedingungsoperator (wird später in diesem Kapitel erklärt).
!!x
Verwendet den logischen Nicht-Operator (!). Dieser Operator wandelt seinen Operanden in einen Boolean um. Er wird ein zweites Mal angewendet, um ein nicht negiertes Ergebnis zu erhalten.
Tab. 4 beschreibt, wie verschiedene Werte in Booleans konvertiert werden.
x |
Boolean(x) |
|---|---|
undefined |
false |
null |
false |
| boolean | x (keine Änderung) |
| number | 0 → false, NaN → false |
Andere Zahlen → true |
|
| bigint | 0 → false |
Andere Zahlen → true |
|
| string | '' → false |
Andere Zeichenketten → true |
|
| symbol | true |
| object | Immer true |
Beim Prüfen der Bedingung einer if-Anweisung, einer while-Schleife oder einer do-while-Schleife verhält sich JavaScript anders als erwartet. Betrachten Sie zum Beispiel die folgende Bedingung
if (value) {}In vielen Programmiersprachen ist diese Bedingung äquivalent zu
if (value === true) {}In JavaScript ist sie jedoch äquivalent zu
if (Boolean(value) === true) {}Das heißt, JavaScript prüft, ob value beim Konvertieren in einen Boolean true ist. Diese Art der Prüfung ist so üblich, dass die folgenden Bezeichnungen eingeführt wurden
true ergibt.false ergibt.Jeder Wert ist entweder truthy oder falsy. Wenn wir Tab. 4 konsultieren, können wir eine vollständige Liste der falsy Werte erstellen
undefinednullfalse0, NaN0n''Alle anderen Werte (einschließlich aller Objekte) sind truthy
> Boolean('abc')
true
> Boolean([])
true
> Boolean({})
trueif (x) {
// x is truthy
}
if (!x) {
// x is falsy
}
if (x) {
// x is truthy
} else {
// x is falsy
}
const result = x ? 'truthy' : 'falsy';Der Bedingungsoperator, der in der letzten Zeile verwendet wird, wird später in diesem Kapitel erklärt.
Übung: Truthiness
exercises/booleans/truthiness_exrc.mjs
In JavaScript erhalten Sie normalerweise undefined als Ergebnis, wenn Sie etwas lesen, das nicht existiert (z. B. ein fehlender Parameter oder eine fehlende Eigenschaft). In diesen Fällen besteht eine Existenzprüfung darin, einen Wert mit undefined zu vergleichen. Der folgende Code prüft beispielsweise, ob das Objekt obj die Eigenschaft .prop hat
if (obj.prop !== undefined) {
// obj has property .prop
}Da undefined falsy ist, können wir diese Prüfung wie folgt verkürzen
if (obj.prop) {
// obj has property .prop
}Existenzprüfungen, die auf Truthiness basieren, haben einen Fallstrick: Sie sind nicht sehr präzise. Betrachten Sie dieses vorherige Beispiel
if (obj.prop) {
// obj has property .prop
}Der Körper der if-Anweisung wird übersprungen, wenn
obj.prop fehlt (in diesem Fall gibt JavaScript undefined zurück).Er wird jedoch auch übersprungen, wenn
obj.prop undefined ist.obj.prop irgendein anderer falsy Wert ist (null, 0, '' usw.).In der Praxis verursacht dies selten Probleme, aber Sie müssen sich dieses Fallstricks bewusst sein.
Eine Truthiness-Prüfung wird oft verwendet, um festzustellen, ob der Aufrufer einer Funktion einen Parameter übergeben hat
function func(x) {
if (!x) {
throw new Error('Missing parameter x');
}
// ···
}Auf der positiven Seite ist dieses Muster etabliert und kurz. Es löst korrekt Fehler für undefined und null aus.
Auf der negativen Seite gibt es den bereits erwähnten Fallstrick: Der Code löst auch Fehler für alle anderen falsy Werte aus.
Eine Alternative ist die Prüfung auf undefined
if (x === undefined) {
throw new Error('Missing parameter x');
}Truthiness-Prüfungen werden ebenfalls oft verwendet, um festzustellen, ob eine Eigenschaft existiert
function readFile(fileDesc) {
if (!fileDesc.path) {
throw new Error('Missing property: .path');
}
// ···
}
readFile({ path: 'foo.txt' }); // no errorAuch dieses Muster ist etabliert und hat die übliche Einschränkung: Es löst nicht nur aus, wenn die Eigenschaft fehlt, sondern auch, wenn sie existiert und einen der falsy Werte hat.
Wenn Sie wirklich prüfen möchten, ob die Eigenschaft existiert, müssen Sie den in-Operator verwenden
if (! ('path' in fileDesc)) {
throw new Error('Missing property: .path');
}? :)Der Bedingungsoperator ist die Ausdrucksversion der if-Anweisung. Seine Syntax ist
«condition» ? «thenExpression» : «elseExpression»
Er wird wie folgt ausgewertet
condition truthy ist, werten Sie thenExpression aus und geben Sie sie zurück.elseExpression aus und geben Sie sie zurück.Der Bedingungsoperator wird auch ternärer Operator genannt, da er drei Operanden hat.
Beispiele
> true ? 'yes' : 'no'
'yes'
> false ? 'yes' : 'no'
'no'
> '' ? 'yes' : 'no'
'no'Der folgende Code zeigt, dass welcher der beiden Zweige „then“ und „else“ über die Bedingung ausgewählt wird, nur dieser Zweig ausgewertet wird. Der andere Zweig nicht.
const x = (true ? console.log('then') : console.log('else'));
// Output:
// 'then'x && y), Oder (x || y)Die binären logischen Operatoren && und || sind wert-erhaltend und short-circuiting.
Wert-Erhaltung bedeutet, dass Operanden als Booleans interpretiert, aber unverändert zurückgegeben werden
> 12 || 'hello'
12
> 0 || 'hello'
'hello'Short-Circuiting bedeutet, dass der zweite Operand nicht ausgewertet wird, wenn der erste Operand das Ergebnis bereits bestimmt. Der einzige andere Operator, der die Auswertung seiner Operanden verzögert, ist der Bedingungsoperator. Normalerweise werden alle Operanden ausgewertet, bevor eine Operation durchgeführt wird.
Zum Beispiel wertet das logische Und (&&) seinen zweiten Operanden nicht aus, wenn der erste falsy ist
const x = false && console.log('hello');
// No outputWenn der erste Operand truthy ist, wird console.log() ausgeführt
const x = true && console.log('hello');
// Output:
// 'hello'x && y)Der Ausdruck a && b („a Und b“) wird wie folgt ausgewertet
a aus.b aus und geben Sie das Ergebnis zurück.Mit anderen Worten, die folgenden beiden Ausdrücke sind ungefähr äquivalent
a && b
!a ? a : bBeispiele
> false && true
false
> false && 'abc'
false
> true && false
false
> true && 'abc'
'abc'
> '' && 'abc'
''||)Der Ausdruck a || b („a Oder b“) wird wie folgt ausgewertet
a aus.b aus und geben Sie das Ergebnis zurück.Mit anderen Worten, die folgenden beiden Ausdrücke sind ungefähr äquivalent
a || b
a ? a : bBeispiele
> true || false
true
> true || 'abc'
true
> false || true
true
> false || 'abc'
'abc'
> 'abc' || 'def'
'abc'||): Bereitstellung von StandardwertenECMAScript 2020 führte den Nullish Coalescing Operator (??) für Standardwerte ein. Zuvor wurde logisches Oder für diesen Zweck verwendet
const valueToUse = receivedValue || defaultValue;Weitere Informationen zu ?? und den Nachteilen von || in diesem Fall finden Sie unter §14.4 „Der Nullish Coalescing Operator (??) für Standardwerte [ES2020]“.
Legacy-Übung: Standardwerte über den Oder-Operator (
||)
exercises/booleans/default_via_or_exrc.mjs
!)Der Ausdruck !x („Nicht x“) wird wie folgt ausgewertet
x aus.false zurück.true zurück.Beispiele
> !false
true
> !true
false
> !0
true
> !123
false
> !''
true
> !'abc'
false Quiz
Siehe Quiz-App.