Eine zusammengesetzte Anweisung ermöglicht Ihnen, mehrere Anweisungen an Stellen zu verwenden, an denen JavaScript eine einzelne Anweisung erwartet. Die leere Anweisung ist genau das Gegenteil: Sie ermöglicht Ihnen, dort auf eine Anweisung zu verzichten, wo eigentlich eine erwartet wird. Die leere Anweisung sieht so aus:
;
Wenn er eine leere Anweisung ausführt, bleibt der JavaScript-Interpreter ansonsten einfach untätig. Eine leere Anweisung kann manchmal nützlich sein, wenn Sie eine Schleife ohne Inhalt erstellen wollen. Betrachten Sie die folgende for-Schleife (die wir in 5.4.3 behandeln werden):
// Ein Array a initialisieren.
for (let i = 0; i < a.length; a[i++] = 0) ;
In dieser Schleife erfolgt die gesamte Arbeit durch den Ausdruck a[i++] = 0, weiterer Schleifeninhalt ist deswegen nicht erforderlich. Die JavaScript-Syntax verlangt jedoch eine Anweisung als Schleifentext, sodass hier einfach eine leere Anweisung – realisiert durch das abschließende »einsame« Semikolon – verwendet wird.
Beachten Sie bitte, dass ein Semikolon, das Sie versehentlich nach der schließenden runden Klammer einer for-Schleife, einer while-Schleife oder einer if-Anweisung einfügen, zu frustrierenden und schwer aufzuspürenden Fehlern führen kann. Beispielsweise macht der folgende Code wahrscheinlich nicht das, was der Autor beabsichtigt:
if ((a === 0) || (b === 0)); // Oje! Diese Zeile tut ja gar nichts …
o = null; //… während diese immer ausgeführt wird.
Wenn Sie mit Absicht eine leere Anweisung verwenden, ist es empfehlenswert, das in einem Kommentar klarzustellen und zu dokumentieren, damit man selbst oder jemand anderer es später nicht für einen Fehler hält, zum Beispiel:
for(let i = 0; i < a.length; a[i++] = 0) /* leere Anweisung! */ ;
5.3Bedingungen
Bedingungsanweisungen führen andere Anweisungen aus oder überspringen andere Anweisungen, abhängig vom Wert eines angegebenen Ausdrucks. Diese Anweisungen sind Entscheidungspunkte Ihres Codes und werden gelegentlich auch als »Verzweigungen« bezeichnet. Wenn Sie sich vorstellen, dass der JavaScript-Interpreter einem Pfad durch Ihren Code folgt, sind Bedingungsanweisungen diejenigen Stellen, an denen sich der Code in zwei oder mehr Pfade verzweigt, unter denen der Interpreter einen auswählen muss.
Die folgenden Unterabschnitte erläutern die grundlegende Bedingungsanweisung von JavaScript, die if/else-Anweisung sowie switch, eine komplexere Verzweigungsanweisung, die mehrere Pfade enthalten kann.
5.3.1if
Die if-Anweisung ist die grundlegende Kontrollanweisung, die es JavaScript ermöglicht, Entscheidungen zu treffen oder – präziser ausgedrückt – Anweisungen bedingt auszuführen. Diese Anweisung kennt zwei Formen. Die erste sieht so aus:
if (Ausdruck)
Anweisung
Bei dieser Variante wird zunächst der Ausdruck ausgewertet. Ist der resultierende Wert ein nicht-strikt wahrer Wert, wird die Anweisung ausgeführt. Ergibt der Ausdruck einen nicht-strikt falschen Wert, wird die Anweisung nicht ausgeführt. (Eine Definition der Begriffe nicht-strikt wahrer und nicht-strikt falscher Wert finden Sie in 3.4.) Ein Beispiel:
if (username == null) // Wenn der Benutzername null oder undefined ist,
username = "John Doe"; // legen Sie ihn fest.
Oder ganz ähnlich:
// Wenn der Benutzername null, undefined, false, 0, "" oder NaN ist,
// geben Sie ihm einen neuen Wert:
if (!username) username = "John Doe";
Beachten Sie, dass die Klammern um den Ausdruck ein erforderlicher Teil der Syntax der if-Anweisung sind.
Die JavaScript-Syntax verlangt, dass nach dem Schlüsselwort if und dem in Klammern eingefassten Ausdruck eine einzelne Anweisung folgt, aber man kann mehrere Anweisungen in einem Anweisungsblock zusammenfassen. Die if-Anweisung könnte also auch so aussehen:
if (!address) {
address = "";
message = "Please specify a mailing address.";
}
Die zweite Form der if-Anweisung führt eine else-Klausel ein, die ausgeführt wird, wenn der Ausdruck false ist. Die Syntax sieht so aus:
if (Ausdruck)
Anweisung_1
else
Anweisung_2
Diese Form der Anweisung führt Anweisung_1 aus, wenn der Ausdruck ein nichtstrikt wahrer Wert ist, und Anweisung_2, wenn der Ausdruck einen nicht-strikt falschen Wert ergibt, zum Beispiel:
if (n === 1)
console.log("You have 1 new message.");
else
console.log(`You have ${n} new messages.`);
Wenn Sie verschachtelte if-Anweisungen mit else-Klauseln verwenden, sollten Sie sicherstellen, dass die else-Klauseln den entsprechenden if-Anweisungen zugeordnet sind. Betrachten Sie die folgenden Zeilen:
i = j = 1;
k = 2;
if (i === j)
if (j === k)
console.log("i equals k");
else
console.log("i doesn't equal j"); // FALSCH!
In diesem Beispiel bildet die innere if-Anweisung die einzige Anweisung, die an dieser Stelle aufgrund der Syntax des äußeren if gestattet wird. Unglücklicherweise ist nicht klar, zu welchem if das else gehört – sieht man von dem Hinweis ab, der durch die Einrückung entsteht. Und im gezeigten Beispiel ist die Einrückung zudem falsch, weil ein JavaScript-Interpreter den Beispielcode tatsächlich so interpretiert:
if (i === j) {
if (j === k)
console.log("i equals k");
else
console.log("i doesn't equal j"); // HOPPLA!
}
Die Regeln von JavaScript besagen (wie in den meisten Programmiersprachen), dass eine else-Klausel standardmäßig zur nächstgelegenen if-Anweisung gehört. Sie sollten geschweifte Klammern einsetzen, um dieses Beispiel eindeutiger zu gestalten. Dann lässt sich der Code leichter lesen, verstehen, warten und debuggen:
if (i === j) {
if (j === k) {
console.log("i equals k");
}
} else { // Was für einen Unterschied die Position einer geschweiften
// Klammer macht!
console.log("i doesn't equal j");
}