Abschnitt 3 · Lektion 3
Wahr genug und falsch genug
In der nächsten Lektion baust du Bedingungen, und dann steht dort nicht immer ein sauberer Vergleich. Oft steht dort einfach ein Wert, und JavaScript muss entscheiden, ob er als wahr durchgeht.
Die gute Nachricht: Die Regel dafür passt in einen Satz.
Die Liste
<h1>Ausgabe</h1>
<p>Was dieses Beispiel tut, steht in der Console.</p> // Diese sieben gelten als falsch. Mehr sind es nicht.
console.log("false: ", Boolean(false));
console.log("0: ", Boolean(0));
console.log("-0: ", Boolean(-0));
console.log("leerer Text:", Boolean(""));
console.log("null: ", Boolean(null));
console.log("undefined:", Boolean(undefined));
console.log("NaN: ", Boolean(NaN)); Sieben Werte gelten als falsch. Das ist die vollständige Liste, es gibt keine achte Zeile:
false, 0, -0, der leere Text "", null, undefined und NaN.
Und dann der Satz, auf den es ankommt: Alles andere ist wahr. Wirklich alles.
Der Fachbegriff dafür lautet falsy und truthy, auf Deutsch etwa „falsch genug” und „wahr genug”. Ein if fragt nie „ist das true”, sondern „ist das wahr genug”.
Der Vollständigkeit halber gibt es noch 0n, die Null als bigint, und document.all aus einer sehr alten Browser-Zeit. Beide wirst du nie brauchen.
Was alles wahr ist
<h1>Ausgabe</h1>
<p>Was dieses Beispiel tut, steht in der Console.</p> // Alles, was nicht auf der Liste steht, ist wahr. Auch das hier.
console.log("\"0\": ", Boolean("0"));
console.log("\"false\": ", Boolean("false"));
console.log("leeres Array: ", Boolean([]));
console.log("leeres Objekt:", Boolean({}));
console.log("ein Leerzeichen:", Boolean(" "));
console.log("die Zahl -1: ", Boolean(-1)); Hier wird es interessant, denn die Liste ist enger, als man denkt.
"0" ist wahr. Es ist ein Text mit einem Zeichen darin, und der leere Text steht auf der Liste, dieser nicht.
"false" ist wahr. Aus demselben Grund.
Ein leeres Array ist wahr. Ein leeres Objekt ist wahr. Ein Leerzeichen ist wahr, weil es eben nicht der leere Text ist.
Und -1 ist wahr, wie jede Zahl außer der Null. Negativ heißt nicht falsch.
Das ist eine Liste mit sieben Einträgen und einem Satz dahinter, und damit ist sie das seltene Regelwerk, das sich vollständig befragen lässt. Nimm dir einen Wert, von dem du es nicht sicher weißt, und tipp Boolean( davor in die Eingabezeile der Console. Boolean("0") ist true, Boolean([]) ist true, Boolean(" ") ist true. Wenn du dabei einen Wert findest, der false liefert und nicht auf der Liste steht, hast du etwas gefunden, das es nicht gibt.
Das leere Array
<h1>Ausgabe</h1>
<p>Was dieses Beispiel tut, steht in der Console.</p> const treffer = [];
// So gefragt lautet die Antwort immer ja, auch bei null Treffern.
console.log("Array als Bedingung:", Boolean(treffer));
// Gefragt werden muss nach der Anzahl.
console.log("Anzahl als Bedingung:", Boolean(treffer.length));
// Bei einem Text ist es genau andersherum als erwartet:
// der leere Text ist falsch, das leere Array wahr.
console.log("Leerer Text:", Boolean("")); Von allen Überraschungen ist diese die teuerste, weil sie so oft vorkommt.
Du hast eine Suche laufen lassen und willst wissen, ob sie etwas gefunden hat. Also fragst du: Wenn treffer, dann zeig sie an. Und das trifft immer zu, auch bei null Treffern, denn ein leeres Array ist wahr.
Der Grund ist, dass ein Array ein Objekt ist, und Objekte stehen nicht auf der Liste. Ob etwas darin liegt, spielt keine Rolle.
Richtig gefragt wird nach der Anzahl: treffer.length. Die ist bei null Treffern 0, und 0 steht auf der Liste. Bei einem Text funktioniert die naive Frage dagegen, weil der leere Text auf der Liste steht, und genau diese Ungleichbehandlung macht den Fehler so schwer zu bemerken.
Merk dir die Regel als Handgriff: Bei Arrays fragst du nach .length, nicht nach dem Array selbst.
Absichtlich umwandeln
<h1>Ausgabe</h1>
<p>Was dieses Beispiel tut, steht in der Console.</p> const eingabe = "Mario";
// Zwei Schreibweisen, dasselbe Ergebnis.
console.log("Mit Boolean:", Boolean(eingabe));
console.log("Mit zwei Ausrufezeichen:", !!eingabe);
// Ein einzelnes Ausrufezeichen dreht um.
console.log("Einmal umgedreht:", !eingabe);
console.log("Und zweimal: ", !!eingabe);
// Genau das macht ein if von selbst, ganz ohne Umwandlung im Code.
console.log("Der Wert selbst:", eingabe); Wenn du einen echten Wahrheitswert brauchst, gibt es zwei Schreibweisen.
Boolean(wert) ist die ausgeschriebene Form. !!wert ist die kurze: Ein Ausrufezeichen dreht um und macht dabei einen Wahrheitswert daraus, das zweite dreht wieder zurück. Es ist kein besonderer Operator, sondern zweimal derselbe.
Beide liefern dasselbe. Boolean() liest sich besser, !! sieht man häufiger.
Brauchen wirst du das seltener, als du jetzt denkst. Ein if wandelt von selbst um, und dann ist die Umwandlung im Code nur Rauschen. Nötig wird sie, wenn du den Wahrheitswert wirklich als Wert brauchst: um ihn zurückzugeben, in einem Array abzulegen oder in eine Eigenschaft zu schreiben.
Ein Wort zur Vorsicht, das erst ab Abschnitt 13 wichtig wird: Boolean("false") ist true. Wenn dir ein Wert als Text ins Haus kommt, etwa aus einem Formular oder aus dem Browserspeicher, hilft die Umwandlung nicht weiter. Dann musst du selbst festlegen, was als Ja gilt, zum Beispiel mit einem Vergleich gegen "true".
Zum Mitnehmen
Die Liste der falschen Werte ist kurz genug zum Auswendiglernen: false, 0, -0, leerer Text, null, undefined, NaN. Alles andere ist wahr.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
Was in dieser Lektion steckt
-
Artikel mit 4 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe im Editor, direkt im Browser geprüft
Öffnet sich mit dem Basis Konto.