JavaScript – Das Handbuch für die Praxis. David Flanagan
Wenn keiner der case-Ausdrücke mit dem switch-Ausdruck übereinstimmt, beginnt die switch-Anweisung, wie bereits erläutert, mit der Ausführung ihres Inhalts bei der mit default markierten Anweisung. Gibt es keine default-Sprungmarke, überspringt die switch-Anweisung ihren Codeblock vollständig. Beachten Sie bitte, dass sich in den gezeigten Beispielen die Sprungmarke default am Ende des switch-Anweisungsblocks nach allen case-Sprungmarken befindet. Das ist der logische und übliche Platz dafür, aber tatsächlich darf sie überall im Block der Anweisung erscheinen.
5.4Schleifen
Um Bedingungsanweisungen zu verstehen, haben wir uns vorgestellt, dass der JavaScript-Interpreter einem sich verzweigenden Pfad durch den Quellcode folgt. Mit Schleifenanweisungen wird dieser Pfad wieder auf sich selbst zurückgebogen, sodass Teile des Codes wiederholt ausgeführt werden. JavaScript kennt fünf Schleifenanweisungen: while, do/while, for, for/of (und dessen for/await-Variante) sowie for/in. Die folgenden Unterabschnitte erklären diese nacheinander. Schleifen werden typischerweise auch verwendet, um über die Elemente eines Arrays zu iterieren. 7.6 diskutiert diese Art von Schleife im Detail und behandelt spezielle Schleifenmethoden, die von der Klasse Array definiert werden.
5.4.1while
So wie die if-Anweisung die grundlegende Bedingungsanweisung von JavaScript ist, so ist die while-Anweisung die elementare Schleife. Sie hat folgende Syntax:
while (Ausdruck)
Anweisung
Bei der Ausführung einer while-Anweisung wertet der Interpreter zuerst den Ausdruck aus. Ist der Wert ein falsy-Wert, überspringt der Interpreter die Anweisung im Schleifenkörper und geht zur nächsten Anweisung im Programm. Ergibt der Ausdruck dagegen einen truthy-Wert, führt der Interpreter die Anweisung aus, springt zurück zum Beginn der Schleife und wertet den Ausdruck erneut aus. Mit anderen Worten: Der Interpreter führt die Anweisung so lange erneut aus, wie der Ausdruck einen truthy-Wert ergibt. Beachten Sie bitte, dass Sie mit der Anweisung while(true) eine Endlosschleife erzeugen können.
Normalerweise möchte man nicht, dass JavaScript genau die gleiche Operation immer und immer wieder ausführt. In fast jeder Schleife ändert sich beim Durchlaufen der Schleife – einer Iteration – mindestens eine Variable. Da sich die Variablen ändern, können sich bei jedem Schleifendurchlauf die Aktionen ändern, die bei der Ausführung der Anweisung durchgeführt werden. Spielen die sich ändernden Variablen im Ausdruck eine Rolle, kann dieser zudem bei jeder Iteration anders lauten. Das ist entscheidend, da sich andernfalls ein Ausdruck, der zu Anfang einen truthy-Wert ergibt, nie ändern und die Schleife deswegen niemals enden würde! Hier ein Beispiel für eine while-Schleife, die die Zahlen von 0 bis 9 ausgibt:
let count = 0;
while(count < 10) {
console.log(count);
count++;
}
Wie Sie sehen, hat die Variable count zu Beginn den Wert 0 und wird bei jeder Ausführung des Schleifeninhalts inkrementiert. Sobald die Schleife 10-mal ausgeführt wurde, wird der Ausdruck false (d.h., der Wert der Variablen count ist nicht mehr kleiner als 10), die while-Anweisung wird beendet, und der Interpreter kann zur nächsten Anweisung im Programm übergehen. Viele Schleifen haben eine Zählervariable wie count. Für Schleifenzähler werden häufig die Variablenamen i, j und k verwendet, aber Sie sollten aussagekräftigere Namen nutzen, falls Ihr Code dadurch verständlicher wird.
5.4.2do/while
Die do/while-Schleife verhält sich wie eine while-Schleife, nur dass der Schleifenausdruck am Ende geprüft wird und nicht am Anfang der Schleife. Das bedeutet auch, dass der Inhalt der Schleife mindestens einmal ausgeführt wird. Die Syntax lautet:
do
Anweisung
while (Ausdruck);
Die do/while-Schleife wird seltener eingesetzt als ihre Schwester while – in der Praxis ist man sich einfach selten sicher, ob eine Schleife immer mindestens einmal ausgeführt werden sollte. Hier ein Beispiel für eine do/while-Schleife:
function printArray(a) {
let len = a.length, i = 0;
if (len === 0) {
console.log("Empty Array");
} else {
do {
console.log(a[i]);
} while(++i < len);
}
}
Es gibt ein paar syntaktische Unterschiede zwischen einer do/while-Schleife und der gewöhnlichen while-Schleife. Vor allem verlangt die do-Variante, dass man sowohl das Schlüsselwort do (zur Markierung des Schleifenanfangs) als auch das Schlüsselwort while (zur Markierung des Endes und zur Einführung der Schleifenbedingung) verwendet. Außerdem muss eine do-Schleife immer mit einem Semikolon abgeschlossen werden. Die while-Schleife dagegen verlangt kein Semikolon, wenn der Schleifenkörper in geschweifte Klammern eingeschlossen ist.
5.4.3for
Die for-Schleife lässt sich oft bequemer einsetzen als eine while-Schleife. Die for-Anweisung vereinfacht Schleifen, die einem verbreiteten Muster entsprechen. Die meisten Schleifen besitzen irgendeine Art von Schleifenzähler. Das ist eine Variable, die initialisiert wird, wenn die Ausführung der Schleife beginnt, und vor jedem Durchlauf der Schleife geprüft wird. Am Ende der Schleife wird die Zählervariable schließlich inkrementiert oder auf andere Weise aktualisiert, unmittelbar bevor sie erneut geprüft wird. Bei Schleifen dieser Art sind Initialisierung, Prüfung und Aktualisierung die drei entscheidenden Manipulationen der Schleifenvariablen. Die for-Anweisung codiert diese drei Schritte als Ausdrücke und macht diese Ausdrücke zu einem expliziten Bestandteil der Schleifensyntax:
for(Initialisierung ; Prüfung ; Inkrementierung)
Anweisung
Initialisierung, Prüfung und Inkrementierung sind drei Ausdrücke (die durch Semikola getrennt werden), die die Schleifenvariable initialisieren, prüfen und inkrementieren. Dadurch, dass sie alle in der ersten Zeile der Schleife stehen, lässt sich leicht erkennen, was eine for-Schleife macht, und es erinnert daran, die Initialisierung und Inkrementierung der Schleifenvariablen nicht zu vergessen.
Am einfachsten lässt sich die Arbeitsweise einer for-Schleife anhand einer äquivalenten while-Schleife zeigen:2
Initialisierung;
while(Prüfung){
Anweisung
Inkrementierung;
}
Der Ausdruck Initialisierung wird einmal ausgewertet, bevor die Schleife beginnt. Damit er nützlich ist, muss dieser Ausdruck Seiteneffekte haben (in der Regel eine Zuweisung). JavaScript erlaubt auch, dass die Initialisierung eine Anweisung zur Variablendeklaration ist, sodass man den Schleifenzähler gleichzeitig deklarieren und initialisieren kann. Der Ausdruck Prüfung wird vor jeder Iteration ausgewertet und entscheidet, ob der Inhalt der Schleife ausgeführt wird. Wird Prüfung zu einem truthy-Wert ausgewertet, wird die Anweisung ausgeführt, die den Schleifenkörper bildet. Abschließend wird der Ausdruck Inkrementierung ausgewertet. Auch das sollte ein Ausdruck mit Seiteneffekten sein, damit er hier einen Sinn hat. Normalerweise ist