Kapitel 10. Booleans
Inhaltsverzeichnis
Das Buch kaufen
(Werbung, bitte nicht blockieren.)

Kapitel 10. Booleans

Der primitive boolesche Datentyp umfasst die Werte true und false:

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

Konvertierung in Boolean

Werte werden wie folgt in Booleans konvertiert:

WertKonvertiert zu Boolean

undefined

false

null

false

Ein boolescher Wert

Identisch mit der Eingabe (keine Konvertierung erforderlich)

Eine Zahl

0, NaNfalse

andere Zahlen → true

Ein String

''false

andere Strings → true

Ein Objekt

true (immer!)

Manuelle Konvertierung in Boolean

Es gibtdrei Möglichkeiten, wie ein Wert in einen Boolean konvertiert werden kann:

Boolean(wert)

(Als Funktion aufgerufen, nicht als Konstruktor)

wert ? true : false

!!wert

Ein einzelnes „nicht“ konvertiert zu einem negierten Boolean; doppelt verwenden für die nicht negierte Konvertierung.

Ich bevorzugeBoolean(), da es aussagekräftiger ist. Hier sind einige Beispiele:

> Boolean(undefined)
false
> Boolean(null)
false

> Boolean(0)
false
> Boolean(1)
true
> Boolean(2)
true

> Boolean('')
false
> Boolean('abc')
true
> Boolean('false')
true

Truthy und Falsy Werte

Überall dort, wo JavaScript einen Boolean erwartet, können Sie jeden Werttyp angeben, und er wird automatisch in einen Boolean konvertiert. Somit gibt es in JavaScript zwei Wertesätze: ein Satz wird zu false konvertiert, während der andere Satz zu true konvertiert wird. Diese Sätze werden als falsy values und truthy values bezeichnet. Angesichts der vorherigen Tabelle sind die folgenden Werte alle falsy:

  • undefined, null
  • Boolean: false
  • Zahl: 0, NaN
  • String: ''

Alle anderen Werte – einschließlich aller Objekte, selbst leerer Objekte, leerer Arrays und new Boolean(false) – sind truthy. Da undefined und null falsy sind, können Sie die if-Anweisung verwenden, um zu überprüfen, ob eine Variable x einen Wert hat.

if (x) {
    // x has a value
}

Der Vorbehalt ist, dass die vorherige Überprüfung alle falsy Werte als „keinen Wert haben“ interpretiert, nicht nur undefined und null. Aber wenn Sie mit dieser Einschränkung leben können, erhalten Sie ein kompaktes und etabliertes Muster.

Fallstrick: Alle Objekte sind truthy

Alle Objekte sindtruthy:

> Boolean(new Boolean(false))
true
> Boolean([])
true
> Boolean({})
true

Das unterscheidet sich von der Art und Weise, wie Objekte in eineZahl oder einen String konvertiert werden, wo Sie das Ergebnis steuern können, indem Sie die Methoden valueOf() und toString() implementieren:

> Number({ valueOf: function () { return 123 } })
123
> String({ toString: function () { return 'abc' } })
'abc'

Geschichte: Warum sind Objekte immer truthy?

Die Konvertierung in Boolean ist aus historischen Gründen unterschiedlich. Für ECMAScript 1 wurde beschlossen, Objekten nicht zu ermöglichen, diese Konvertierung zu konfigurieren (z. B. über eine toBoolean()-Methode). Die Begründung war, dass die booleschen Operatoren || und && die Werte ihrer Operanden beibehalten. Daher kann bei Verkettung dieser Operatoren derselbe Wert mehrmals auf Wahrheit oder Falschheit geprüft werden. Solche Prüfungen sind bei Primitiven günstig, wären aber bei Objekten teuer, wenn diese ihre Konvertierung in Boolean konfigurieren könnten. ECMAScript 1 vermied diese Kosten, indem es Objekte immer truthy machte.

Logische Operatoren

In diesem Abschnitt behandeln wir die Grundlagen der logischen Operatoren Und (&&), Oder (||) und Nicht (!).

Binäre logische Operatoren: Und (&&) und Oder (||)

Binäre logische Operatoren sind:

Wert-erhaltend

Sie geben immer einen der Operanden unverändert zurück.

> 'abc' || 123
'abc'
> false || 123
123
Kurzschluss-Auswertung (Short-circuiting)

Der zweite Operand wird nicht ausgewertet, wenn der erste Operand das Ergebnis bereits bestimmt. Zum Beispiel (das Ergebnis von console.log ist undefined):

> true || console.log('Hello')
true
> false || console.log('Hello')
Hello
undefined

Das ist ein ungewöhnliches Verhalten für Operatoren. Normalerweise werden alle Operanden ausgewertet, bevor ein Operator aufgerufen wird (genau wie bei Funktionen).

Wenn der erste Operand in einen true konvertiert werden kann, gib ihn zurück. Andernfalls gib den zweiten Operanden zurück:

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

Beispiel 2: Ein Standardwert für eine Eigenschaft

Das Objekt options kann die Eigenschaft title haben oder nicht. Wenn sie fehlt, sollte der Wert 'Untitled' verwendet werden, wenn der Titel gesetzt wird.

setTitle(options.title || 'Untitled');

Beispiel 3: Ein Standardwert für das Ergebnis einer Funktion

Die Funktion countOccurrences zählt, wie oft regex in str übereinstimmt.

function countOccurrences(regex, str) {
    // Omitted: check that /g is set for `regex`
    return (str.match(regex) || []).length;
}

Das Problem ist, dass match() (siehe String.prototype.match: Capture-Gruppen oder Rückgabe aller übereinstimmenden Teilstrings) entweder ein Array oder null zurückgibt. Dank || wird im letzteren Fall ein Standardwert verwendet. Daher können Sie in beiden Fällen sicher auf die Eigenschaft length zugreifen.

Die Funktion Boolean

Die Funktion Boolean kann auf zwei Arten aufgerufen werden.

Boolean(wert)

Als normale Funktion konvertiert sie wert in einen primitiven Boolean (siehe Konvertierung in Boolean).

> Boolean(0)
false
> typeof Boolean(false)  // no change
'boolean'
new Boolean(bool)

Als Konstruktor erstellt sie eine neue Instanz von Boolean (siehe Wrapper-Objekte für Primitive), ein Objekt, das bool umschließt (nachdem es in einen Boolean konvertiert wurde). Zum Beispiel:

> typeof new Boolean(false)
'object'

Der erstere Aufruf ist der gebräuchlichste.

Weiter: 11. Zahlen