Tipp
Gestalten Sie die Bedingung so, dass sie entweder true oder false ergibt, auch wenn JavaScript dafür beliebige Werte zulässt und sie in boolesche Werte umwandelt. Wie Sie im nächsten Abschnitt noch sehen werden, sind diese Konvertierungen nicht unbedingt einsichtig und können daher gefährlich sein. Beachten Sie die goldene Regel Nr. 3 aus dem Vorwort:
Seien Sie sich immer über die Typen im Klaren und vermeiden Sie die automatische Typkonvertierung.
Es kommt häufig vor, dass Sie mehrere Anweisungen ausführen wollen, wenn die Bedingung erfüllt ist. Verwenden Sie dazu eine Blockanweisung der folgenden Form:
{
Anweisung1 Anweisung2
...
}
Wenn die Bedingung nicht erfüllt ist, kann wie im folgenden Beispiel eine optionale else-Klausel ausgeführt werden:
if (yourSales > target) {
performance = 'Good'
bonus = 100
} else {
performance = 'Mediocre'
bonus = 0
}
Hinweis
Dieses Beispiel zeigt den »einzig wahren Stil für geschweifte Klammern«, bei dem die öffnende Klammer am Ende der Zeile steht, die der ersten Anweisung in dem Block vorausgeht. Dies ist der übliche Stil in JavaScript.
Handelt es sich bei der else-Klausel wiederum um eine if-Anweisung, wird gewöhnlich das folgende Format verwendet:
if (yourSales > 2 * target) {
performance = 'Excellent'
bonus = 1000
} else if (yourSales > target) {
performance = 'Good'
bonus = 100
} else {
performance = 'Mediocre'
bonus = 0
}
Einzelne Anweisungen müssen nicht in geschweifte Klammern gestellt werden:
if (yourSales > target)
bonus = 100
Vorsicht
Wenn Sie bei if/else-Anweisungen keine geschweiften Klammern verwenden oder nicht dem »einzig wahren Stil« folgen, kann es sein, dass Ihr Code zwar in einer Programmdatei funktioniert, aber fehlschlägt, wenn Sie ihn in eine JavaScript-Konsole kopieren. Betrachten Sie das folgende Beispiel:
if (yourSales > target)
bonus = 100
else
bonus = 0
Einige JavaScript-Konsolen analysieren den Code Zeile für Zeile, sodass sie die if-Anweisung für abgeschlossen halten, bevor sie auf die else-Klausel stoßen. Um dieses Problem zu vermeiden, sollten Sie geschweifte Klammern verwenden oder die gesamte if-Anweisung in eine einzige Zeile schreiben:
if (yourSales > target) bonus = 100; else bonus = 0
Manchmal kann es praktisch sein, einen Ausdruck zur Verfügung zu haben, der wie eine if-Anweisung funktioniert. Nehmen wir an, Sie wollen den größeren von zwei Werten bestimmen:
let max = undefined
if (x > y) max = x; else max = y
Es wäre schöner, wenn wir max stattdessen einfach mit dem größeren der beiden Werte x und y initialisieren könnten. Da if eine Anweisung ist, können wir jedoch nicht einfach Folgendes schreiben:
let max = if (x > y) x else y // Fehler: if-Anweisung ist unerwartet
Stattdessen können Sie den Bedingungsoperator?: verwenden. Der Ausdruck Bedingung ? erster Ausdruck : zweiter Ausdruck wird zum ersten Ausdruck ausgewertet, wenn die Bedingung erfüllt ist, und ansonsten zum zweiten. Dadurch können wir unser Problem wie folgt lösen:
let max = x > y ? x : y
Hinweis
Der Ausdruck x > y ? x : y ist ein anschauliches Beispiel für den Bedingungsoperator, allerdings sollten Sie stattdessen die Methode Math.max aus der Standardbibliothek verwenden, wenn Sie den größeren von zwei Werten benötigen.
2.4Falsy- und Truthy-Werte
Dieser »Verrückter Hutmacher«-Abschnitt beschreibt einen verwirrenden Aspekt von JavaScript ausführlicher. Wenn Sie dem Ratschlag aus dem vorherigen Abschnitt folgen und in Bedingungen nur boolesche Werte verwenden, können Sie ihn getrost überspringen.
In JavaScript müssen Bedingungen (also etwa die in einer if-Anweisung) nicht unbedingt boolesche Werte sein. Auch die »falschen« Werte 0, NaN, null, undefined und der leere String lassen eine Bedingung fehlschlagen. Andere Werte werden dagegen als »wahr« gedeutet, sodass die Bedingung als erfüllt gilt. Gewöhnlich spricht man hierbei von Falsy- bzw. Truthy-Werten. Allerdings sind dies keine offiziellen Begriffe der Sprachspezifikation.
Hinweis
Falsy- und Truthy-Werte können auch bei Schleifenbedingungen, den Operanden der booleschen Operatoren &&, || und! sowie dem ersten Operanden von ? : vorkommen. Alle diese Konstrukte werden noch weiter hinten in diesem Kapitel behandelt.
Auf den ersten Blick erscheinen die Konvertierungsregeln für boolesche Werte vernünftig. Nehmen wir an, Sie wollen lediglich sicherstellen, dass die Variable performance nicht undefined ist. Also schreiben Sie Folgendes:
if (performance) ... // Gefährlich!
Der Test schlägt zwar wie erwartet fehl, wenn die Variable performance den Wert undefined hat (und als Bonus auch, wenn sie null ist). Was aber, wenn performance ein leerer String oder die Zahl 0 ist? Soll der Test diese Fälle genauso behandeln wie das Fehlen eines Wertes? Manchmal kann das sinnvoll sein, manchmal aber nicht. Besser ist es, wenn der Code deutlich macht, was Sie wirklich erreichen wollen:
if (performance !== undefined) ...
2.5Vergleichs- und Gleichheitsoperatoren
JavaScript verfügt über die üblichen Vergleichsoperatoren:
< | kleiner als |
<= | kleiner oder gleich |
>
|