Truthy und Falsy – Programmieren lernen mit JavaScript – Thytos
Nächstes Video startet in 3 Sekunden.
Programmieren lernen mit JavaScript

Truthy und Falsy

In Ja­va­Script gibt es das Kon­zept von truthy und falsy Wer­ten. Das er­leich­tert if-Be­din­gun­gen, kann aber auch zu feh­ler­haf­tem Code führen.

Obwohl in der folgenden if-Bedingung kein boolscher Wert verwendet wird, wirft der Code keine Fehlermeldung.

if ("abc") { alert("Erster Code-Teil"); } else { alert("Zweiter Code-Teil"); }

Die Anweisung aus dem ersten Code-Teil wird ausgeführt. Wieso funktioniert das?

In JavaScript gibt es das Konzept von truthy und falsy Werten. Das bedeutet, dass auch nicht-boolsche Werte in einem boolschen Kontext interpretiert werden.

Das ermöglicht, dass jeder Wert in eine if-Bedingung geschrieben werden kann, egal ob ein String, eine Zahl oder ein Wert anderen Datentyps, es wird alles als true oder false angesehen.
Das ist wichtig zu verstehen, damit es nicht dadurch zu Fehlern kommt.

Grundsätzlich sind alle Werte truthy, werden also als true interpretiert, bis auf bestimmte, festgelegte Ausnahmen.

Datentyp truthy falsy
String Alle nicht-leeren Strings ""
Number Alle Zahlen außer 0 0, NaN
Undefined undefined

Vor- und Nachteile der automatischen Typumwandlung

Diese Typumwandlung in JavaScript kann nützlich sein, aber auch eine Fehlerquelle darstellen.

Ihr könnt den folgenden Code einmal in eurer Browser-Konsole ausführen. In das Eingabefenster, das sich öffnet, gebt ihr eine Zahl ein.

if (prompt("Gib eine Zahl ein") % 2) {
  alert("ungerade");
} else {
  alert("gerade");
}

Der Code funktioniert, ohne dass das Ergebnis der Modulo-Rechnung in einen boolschen Wert umgewandelt werden muss, weil diese Umwandlung in Form von truthy und falsy bereits implizit passiert.

Führt den Code erneut aus, aber gebt diesmal keine Zahl ein, sondern zum Beispiel ein Wort.

Bei Nutzereingaben sollte immer beachtet werden, dass sich Nutzer teilweise unerwartet verhalten.

Der Code wird dennoch weiterhin ausgeführt und das Ergebnis gerade wird angezeigt. Das ist natürlich nicht korrekt. Ein Wort ist keine gerade Zahl. Was ist hier passiert?

  1. Die prompt-Funktion hat den String mit dem eingegebenen Wort zurückgegeben
    if (prompt("Gib eine Zahl ein") % 2) …
    
  2. Es wurde versucht, dieses Wort modulo zwei zu rechnen.
    if ("Nö" % 2) …
    
  3. Da das mathematisch nicht geht, weil "Nö" kein Zahlenwert ist, kam das Ergebnis NaN heraus, was für Not a Number steht.
    if (NaN) …
    
  4. NaN ist ein falsy Wert und wird entsprechend als false interpretiert
    if (false) …
    
  5. Dadurch war die if-Bedingung nicht erfüllt, wodurch der else-Teil ausgeführt wurde
    if (false) { … } else { /* wird ausgeführt */ }
    

Die automatische Umwandlung von Werten zwischen verschiedenen Datentypen kann somit also auch zu Fehlern führen.

Vermeidung von Fehlern

Um solche Fehler zu vermeiden, sollte die automatische Typumwandlung berücksichtigt werden, indem in entsprechenden Fällen der Datentyp eines Wertes überprüft wird.

Im konkreten Beispiel kann die Funktion isNaN zu Hilfe gezogen werden. isNaN, wortgetreu »Is not a number«, zu deutsch »Ist keine Zahl«, gibt true zurück, wenn der übergebene Parameter kein valider Zahlenwert ist.

isNaN("keine Zahl");
// => true

isNaN(5); // 5 ist eine Zahl
// => false // entsprechend kommt false zurück

isNaN(undefined);
// => true

isNaN(NaN);
// => true

Wie sollte der fehlerhafte Code verändert werden, um zu gewährleisten, dass nur gültige Eingaben des Nutzers darauf überprüft werden, ob sie gerade oder ungerade Zahlen sind?

// Die fehlerhafte Stelle im Code
if (prompt("Gib eine Zahl ein") % 2) { …

Mit isNaN wird ermittelt, ob die Nutzereingabe einer validen Zahl entspricht. Doch dann fehlt der Wert, um Modulo zwei zu errechnen.

if (isNaN(prompt("Gib eine Zahl ein")) % 2 ) // Das funktioniert nicht

// isNaN gibt true oder false zurück
// Entsprechend stünde nach der Ausführung von isNaN folgendes
if (true % 2) // Diese Rechnung geht nicht auf

Der Schlüssel zur Lösung liegt darin, zu erkennen, dass zwei Bedingungen nötig sind, die nacheinander ausgeführt werden. Für beide wird der Wert gebraucht, den der Nutzer eingibt. Deswegen ist der erste Schritt, diesen Wert in einer Variablen zu speichern.

var nr = prompt("Gib eine Zahl ein");

Dann muss zuerst getestet werden, ob die Eingabe eine valide Zahl ist. Wenn dies nicht der Fall ist, sollte der Nutzer darauf hingewiesen werden, dass seine Eingabe ungültig war.

if (isNaN(nr)) {
  alert("Die Eingabe entspricht keiner Zahl");
}

Andernfalls, also im else-Teil, wird die if-Bedingung mit der Rechnung von Modulo zwei durchgeführt.

if (isNaN(nr)) {
  alert("Die Eingabe entspricht keiner Zahl");
} else {
  if (nr % 2) {
    alert("Die Zahl " + nr + " ist ungerade");
  } else {
    alert("Die Zahl " + nr + " ist gerade");
  }
}

Durch diese Überprüfung des Wertes wird der Code korrekt ausgeführt.