2.9while- und do-Schleifen
Auch diesen Abschnitt können Sie überspringen, wenn Sie mit C, C++, Java oder C# vertraut sind.
Eine while-Schleife führt eine Anweisung aus (bei der es sich auch um eine Blockanweisung handeln kann), während eine Bedingung erfüllt ist. Die allgemeine Form lautet:
while (Bedingung) Anweisung
Die folgende Schleife ermittelt, wie lange es dauert, einen bestimmten Geldbetrag für Ihren wohlverdienten Lebensabend anzusparen, vorausgesetzt, dass Sie jedes Jahr denselben Geldbetrag zu einem festen Zinssatz anlegen:
let years = 0
while (balance < goal) {
balance += paymentAmount
let interest = balance * interestRate / 100
balance += interest
years++
}
console.log(`${years} years.`)
Ist die Bedingung schon zu Anfang false, wird die while-Schleife niemals ausgeführt. Soll der Block dagegen auf jeden Fall mindestens einmal ausgeführt werden, müssen Sie den Test ans Ende verschieben, indem Sie eine do/while-Schleife verwenden. Deren Syntax sieht wie folgt aus:
do Anweisung while (Bedingung)
Diese Schleife führt die Anweisung aus (gewöhnlich einen Block) und prüft dann die Bedingung. Ist die Bedingung erfüllt, werden die Anweisung und der Test wiederholt. Betrachten Sie dazu das folgende Beispiel:
do {
i++
} while (i < s.length && s[i] != ' ')
Die Schleife endet, wenn entweder i über das Ende des Strings hinausgeht oder s[i] ein Leerzeichen ist.
Die do-Schleife ist weniger gebräuchlich als die while-Schleife.
2.10for-Schleifen
Die for-Schleife ist ein allgemeines Konstrukt für die Iteration über mehrere Elemente. In den folgenden drei Abschnitten sehen wir uns die verschiedenen Varianten an, die in JavaScript zur Verfügung stehen.
2.10.1Die klassische for-Schleife
Die klassische Form der for-Schleife funktioniert genauso wie in C, C++, Java und C#. Dabei wird nach jedem Durchlauf ein Zähler oder eine vergleichbare Variable aktualisiert. Die folgende Schleife protokolliert die Zahlen von 1 bis 10:
for (let i = 1; i <= 10; i++)
console.log(i)
An der ersten Position der for-Anweisung steht die Zählerinitialisierung. Die zweite gibt die Bedingung an, die vor jedem Durchlauf überprüft wird, und die dritte gibt an, wie der Zähler danach geändert werden soll.
Wie die Initialisierung, der Test und die Aktualisierung ablaufen, hängt davon ab, welche Art von Durchlauf Sie damit erreichen wollen. Die Schleife im folgenden Beispiel sucht alle Elemente eines Arrays in umgekehrter Reihenfolge auf:
for (let i = a.length - 1; i >= 0; i--)
console.log(a[i])
Tipp
In der ersten Position einer for-Schleife können Sie beliebige Variablendeklarationen und Ausdrücke verwenden sowie in den anderen Positionen beliebige Ausdrücke. Allerdings gilt es als guter Stil, dabei dieselbe Variable zu initialisieren, zu testen und zu aktualisieren.
Hinweis
Mithilfe des Komma-Operators ist es möglich, mehrere Aktualisierungsausdrücke in die dritte Position einer for-Schleife zu zwängen:
for (let i = 0, j = a.length - 1; i < j; i++, j--) {
let temp = a[i]
a[i] = a[j]
a[j] = temp
}
In i++, j-- werden die beiden Ausdrücke i++ und j-- durch den Komma-Operator zu einem neuen Ausdruck verknüpft. Der Wert eines Komma-Ausdrucks ist derjenige des zweiten Operanden. In diesem Beispiel wird der Wert jedoch nicht verwendet, da uns die Seiteneffekte der Inkrementierung und Dekrementierung gleichgültig sind.
Der Komma-Operator ist nicht sehr beliebt, da er zu unvorhergesehenen Ergebnissen führen kann. Beispielsweise ist Math.max((9, 3)) das Maximum des einzelnen Werts (9, 3) – und das ist 3.
Das Komma in der Deklaration let i = 0, j = a.length -1 ist dagegen kein Komma-Operator, sondern ein syntaktischer Bestandteil der let-Anweisung, die die beiden Variablen i und j deklariert.
2.10.2Die for-of-Schleife
Eine for-of-Schleife durchläuft die Elemente eines iterierbaren Objekts, wobei es sich meistens um ein Array oder einen String handelt. (In Kapitel 8 erfahren Sie, wie Sie auch andere Objekte iterierbar machen können.)
Betrachten Sie dazu das folgende Beispiel:
let arr = [, 2, , 4]
arr[9] = 100
for (const element of arr)
console.log(element) // Gibt undefined, 2, undefined, 4, undefined
// (fünf Mal), 100 aus
Diese Schleife geht alle Elemente des Arrays vom Index 0 bis zu arr.length - 1 in aufsteigender Reihenfolge durch. Die Elemente an den Indizes 0, 2 und 4 bis 8 werden als undefined gemeldet. Die Variable element wird bei jedem Schleifendurchlauf erstellt und mit dem aktuellen Elementwert initialisiert. Sie wird als const deklariert, da sie im Schleifenrumpf nicht geändert wird.
Wenn Sie alle Elemente eines Arrays verarbeiten müssen, ist die for-of-Schleife eine praktische Verbesserung gegenüber der herkömmlichen for-Schleife. Allerdings gibt es immer noch reichlich Anwendungen für die klassische Version, etwa wenn Sie nicht das gesamte Array durchlaufen wollen oder den Indexwert innerhalb der Schleife brauchen.
Wenn Sie mit der for-of-Schleife einen String durchlaufen, sucht diese jeden Unicode-Codepunkt auf. Das ist auch tatsächlich das gewünschte Verhalten. Schauen Sie sich dazu das folgende Beispiel an:
let greeting = 'Hello
for (const c of greeting)
console.log(c) // Gibt H e l l o, ein Leerzeichen und
Sie müssen sich also keine Gedanken darüber machen, dass für