JavaScript für ungeduldige Programmierer (ES2022-Ausgabe)
Bitte unterstützen Sie dieses Buch: kaufen Sie es oder spenden Sie
(Werbung, bitte nicht blockieren.)

15 Booleans



Der primitive Typ boolean umfasst zwei Werte – false und true

> typeof false
'boolean'
> typeof true
'boolean'

15.1 Konvertierung in Booleans

  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.

Tab. 4 beschreibt, wie verschiedene Werte in Booleans konvertiert werden.

Tabelle 4: Konvertierung von Werten in Booleans.
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

15.2 Falsy und truthy Werte

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

Jeder Wert ist entweder truthy oder falsy. Wenn wir Tab. 4 konsultieren, können wir eine vollständige Liste der falsy Werte erstellen

Alle anderen Werte (einschließlich aller Objekte) sind truthy

> Boolean('abc')
true
> Boolean([])
true
> Boolean({})
true

15.2.1 Prüfen auf Truthiness oder Falsiness

if (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

15.3 Truthiness-basierte Existenzprüfungen

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
}

15.3.1 Fallstrick: Truthiness-basierte Existenzprüfungen sind ungenau

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

Er wird jedoch auch übersprungen, wenn

In der Praxis verursacht dies selten Probleme, aber Sie müssen sich dieses Fallstricks bewusst sein.

15.3.2 Anwendungsfall: Wurde ein Parameter übergeben?

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');
}

15.3.3 Anwendungsfall: Existiert eine Eigenschaft?

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 error

Auch 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');
}

15.4 Bedingungsoperator (? :)

Der Bedingungsoperator ist die Ausdrucksversion der if-Anweisung. Seine Syntax ist

«condition» ? «thenExpression» : «elseExpression»

Er wird wie folgt ausgewertet

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'

15.5 Binäre logische Operatoren: Und (x && y), Oder (x || y)

Die binären logischen Operatoren && und || sind wert-erhaltend und short-circuiting.

15.5.1 Wert-Erhaltung

Wert-Erhaltung bedeutet, dass Operanden als Booleans interpretiert, aber unverändert zurückgegeben werden

> 12 || 'hello'
12
> 0 || 'hello'
'hello'

15.5.2 Short-Circuiting

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 output

Wenn der erste Operand truthy ist, wird console.log() ausgeführt

const x = true && console.log('hello');

// Output:
// 'hello'

15.5.3 Logisches Und (x && y)

Der Ausdruck a && b („a Und b“) wird wie folgt ausgewertet

  1. Werten Sie a aus.
  2. Ist das Ergebnis falsy? Geben Sie es zurück.
  3. Andernfalls werten Sie 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 : b

Beispiele

> false && true
false
> false && 'abc'
false

> true && false
false
> true && 'abc'
'abc'

> '' && 'abc'
''

15.5.4 Logisches Oder (||)

Der Ausdruck a || b („a Oder b“) wird wie folgt ausgewertet

  1. Werten Sie a aus.
  2. Ist das Ergebnis truthy? Geben Sie es zurück.
  3. Andernfalls werten Sie 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 : b

Beispiele

> true || false
true
> true || 'abc'
true

> false || true
true
> false || 'abc'
'abc'

> 'abc' || 'def'
'abc'
15.5.4.1 Legacy-Anwendungsfall für logisches Oder (||): Bereitstellung von Standardwerten

ECMAScript 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

15.6 Logisches Nicht (!)

Der Ausdruck !x („Nicht x“) wird wie folgt ausgewertet

  1. Werten Sie x aus.
  2. Ist er truthy? Geben Sie false zurück.
  3. Andernfalls geben Sie true zurück.

Beispiele

> !false
true
> !true
false

> !0
true
> !123
false

> !''
true
> !'abc'
false

  Quiz

Siehe Quiz-App.