JavaScript/Objekte/Boolean
Unter dem Begriff Boolean versteht man in JavaScript dreierlei – zum einen den primitiven Datentyp für boolesche Werte, zum zweiten eine Funktion, die beliebige Werte zum primitiven Boolean-Typ konvertiert und zum dritten ein vordefiniertes Objekt, das dazu da ist, primitive boolesche Werte als Objekt zu kapseln. Diese Bedeutungen müssen genau unterschieden werden.
Der JavaScript-Programmierer verwendet im Normalfall immer den primitiven Datentyp. Die Konstanten true
und false
sind primitive Werte, keine Objekte, und der ! Operator (not) liefert ebenfalls den primitiven Wert. Die Rückgabe der Boolean() Funktion ist ebenfalls ein primitiver Wert.
Das Boolean-Objekt existiert in JavaScript als Helfer, um primitive Boolean-Werte wie Objekte behandeln zu können. Eine Beschreibung dazu findet sich weiter unten.
Inhaltsverzeichnis
Boolesche Werte
Der Begriff geht auf den britischen Mathematiker George Boole zurück, der sich mit Logik und Logikoperationen beschäftigt hat. Ein boolescher Wert ist entweder wahr oder falsch, in JavaScript dargestellt durch die eingebauten Konstanten true
und false
.
Boole'sche Werte finden Verwendung bei der Steuerung des Programmablaufes. Sie können durch logische Operatoren miteinander verknüpft werden, deren Ergebnis dann wieder Boole'sche Werte sind.
Was ist Wahrheit?
Um das Verhalten von JavaScript im Umgang mit Boole'schen Werten und logischen Operatoren zu verstehen, muss man wissen, dass Javascript nicht nur true
und false
als wahr und falsch interpretiert. Einige bestimmte Werte gelten als "falsch-artig", oder "falsy", nämlich
- false
- undefined
- null
- 0
- ""
- document.all (in neueren Browsern)
Alle Werte, die nicht falsy sind, gelten als "wahr-artig", oder "truthy". Sämtliche Objekte, also auch Funktionen oder Arrays sind truthy. JavaScript nimmt es dabei sehr genau. Objekte ohne Eigenschaften oder Arrays mit Länge 0 sind truthy. ""
und null
sind falsy, aber " "
und "null"
sind truthy.
Und was hat es mit document.all
auf sich? Nun, in den schlimmen alten Zeiten der Browser-Kriege war der Internet Explorer berüchtigt für seine „Besonderheiten“. Die all
Eigenschaft von window.document
war eine Collection, die es ursprünglich nur im Internet Explorer gab, und viele Programmierer haben mit if (document.all)
den IE identifiziert. Irgendwann ist man bei Microsoft zur Vernunft gekommen und hat erkannt, dass es in diesem Krieg nur Verlierer geben konnte, und der Internet Explorer begann, Webstandards zu implementieren. Trotzdem konnte man aber document.all
nicht einfach entfallen lassen. Andere Browser haben es ebenfalls angeboten, und viele Scripte wären kaputtgegangen. Die anderen Browser wollten auch nicht wie ein quirksiger IE behandelt werden. Und so kommt es, dass die heutigen Browser ein Objekt, das ganz normal als Objekt funktioniert und nach allen Regeln der Wahrheitsfindung eigentlich truthy sein müsste, als falsy behandeln, um nicht versehentlich mit einem antiken Internet Explorer verwechselt zu werden. Und das ist schließlich sogar so in der HTML-Spezifikation gelandet (siehe Weblinks).
"a" == true
liefert false
, weil die Operanden des ==
-Operators flexibel sein können und deshalb die Typangleichungsregeln verwendet werden.Allgemeines zur Verwendung
Einen primitiven Wert vom Typ Boolean erhält man durch Verwendung der vordefinierten Konstanten true
und false
, oder man kann durch Verwendung der Funktion Boolean()
jeden beliebigen Wert konvertieren. Übergibt man ihr einen der falsy-Werte, erhält man false
, sonst true
.
wahr = true;
auchWahr = Boolean("irgendwas");
stimmt = Boolean(4711);
prima = Boolean(true);
falsch = false;
verkehrt = Boolean(0);
nix = Boolean(null)
garNix = Boolean(); // Kein Argument bedeutet, dass der Parameter den Wert undefined hat
nicht = Boolean("");
fehler = Boolean(false);
// Achtung!
boeseFalle = new Boolean(false);
if (boeseFalle)
alert("Autsch!");
JavaScript nimmt es wirklich sehr genau. Es ist ein Unterschied, ob man Boolean(bla)
oder new Boolean(dings)
verwendet. Ersteres ist ein Funktionsaufruf zum Konvertieren beliebiger Werte in true
oder false
, letzteres ist ein Konstruktor für ein neues Boolean-Objekt, das einen primitiven Boolean-Wert einkapselt. Objekte sind immer truthy, und deshalb würde der obige Beispiel-Code den "Autsch"-Alert anzeigen.
Das Boolean Objekt
Das Boolean-Objekt definiert Methoden für Boole'sche Werte. Wenn JavaScript erkennt, dass auf einem primitiven Boole'schen Wert eine Methode aufgerufen werden soll, so erzeugt es ein Boolean-Objekt und benutzt es als this
für diesen Methodenaufruf. Die beiden folgenden Zeilen bewirken exakt das Gleiche:
false.toString() new Boolean(false).toString()
Das Boolean-Objekt speichert den primitiven Wert in einem internen, unveränderlichen Datenfeld. Er ist über die Methode valueOf()
lesbar.
Eigenschaften
- prototype
Erbt von
Methoden:
Boolean.prototype
Objekte, die mit new Boolean()
erstellt wurden, erben von Boolean.prototype und damit indirekt von Object.prototype.
Erbt von
- Object
Eigenschaften
- constructor - die Boolean-Funktion
Methoden
Wie bei jedem Objekt ist auch für Boolean der Prototyp um eigene Methoden erweiterbar. Hierbei ist allerdings Vorsicht geboten. Diese Methoden bekommen in this
das Boolean-Objekt übergeben, wie jede Methode. Und das ist nicht der primitive Boolean-Wert.
let elem = document.getElementById('button');
elem.addEventListener('click', Meldung);
function layerCheck() {
if (document.layers) {
return true;
} else {
return false;
}
}
function layerCheckCompact() {
return Boolean(document.layers);
}
function Meldung() {
text = 'Die Abfrage nach dem layer-Objekt ergibt: <span>' + layerCheck().toString() +'</span>';
let ausgabe = document.getElementById('ausgabe');
ausgabe.innerHTML = text;
}
Beim Anklicken des Button wird der Rückgabewert der Funktion LayerCheck()
ausgegeben, die in einem Script-Bereich notiert ist. Wenn der Browser das (veraltete) layers-Objekt kennt, wird true zurückgegeben, wenn nicht, dann false. Für die Ausgabe wird das Ergebnis in eine Zeichenkette umgewandelt. Es wird also entweder true
oder false
ausgegeben, je nachdem, ob der Browser Layer kennt oder nicht.
Die Funktion layerCheckCompact
zeigt, wie man solche Abfragen durch Nutzung der Boolean-Funktion kompakter schreiben kann.