JavaScript/Objekte/Boolean

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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.

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).

Beachten Sie: Die Deutung beliebiger Werte als truthy oder falsy erfolgt nicht in jedem Zusammenhang, sondern nur dort, wo explizit ein boolescher Wert erwartet wird. Ein Ausdruck wie "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.

Erzeugen von Boole'schen Werten
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

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.


Umwandlung in eine Zeichenkette ansehen …
  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.

Weblinks