JavaScript für Ungeduldige. Cay Horstmann
Чтение книги онлайн.
Читать онлайн книгу JavaScript für Ungeduldige - Cay Horstmann страница 24
Hinweis
Im nächsten Kapitel lernen Sie eine weitere Möglichkeit kennen, um Arrays zu durchlaufen, nämlich mit Techniken der funktionalen Programmierung. Beispielsweise können Sie wie folgt sämtliche Elemente eines Arrays protokollieren:
arr.forEach((element, key) => { console.log(`${key}: ${element}`) })
Die angegebene Funktion wird für alle Elemente und Indexschlüssel aufgerufen (also die Zahlen 0, 1, 3 und 99 und nicht als Strings).
Vorsicht
Wenn eine for-in-Schleife einen String durchläuft, sucht sie die Indizes der einzelnen Unicode-Codeeinheiten auf. Das ist aber wahrscheinlich nicht das, was Sie wollen. Betrachten Sie dazu das folgende Beispiel:
let greeting = 'Hello
for (const i of greeting)
console.log(greeting[i])
// Gibt H e l l o, ein Leerzeichen und zwei beschädigte Zeichen aus
Die Indizes 6 und 7 für die beiden Codeeinheiten des Unicode-Zeichens
2.11break und continue
Manchmal wollen Sie eine Schleife verlassen, sobald Sie ein bestimmtes Ziel erreicht haben. Nehmen wir an, Sie suchen nach der Position des ersten negativen Elements in einem Array:
let i = 0
while (i < arr.length) {
if (arr[i] < 0) . . .
...
}
Sobald das erste negative Element gefunden ist, wollen Sie die Schleife verlassen, damit i den Wert der Position dieses Elements behält. Das können Sie mit der Anweisung break erreichen:
let i = 0
while (i < arr.length) {
if (arr[i] < 0) break
i++
}
// Wird nach break oder dem regulären Ende der Schleife erreicht
Die Anweisung break ist niemals notwendig. Stattdessen können Sie auch immer eine boolesche Variable verwenden, um das Beenden der Schleife zu steuern. Oft werden solche Variablen done oder found genannt:
let i = 0
let found = false
while (!found && i < arr.length) {
if (arr[i] < 0) {
found = true
} else {
i++
}
}
Ebenso wie in Java gibt es auch in JavaScript break-Anweisungen mit Label, mit denen es möglich ist, aus mehreren verschachtelten Schleifen auszubrechen. Nehmen wir an, Sie möchten die Position des ersten negativen Elements in einem zweidimensionalen Array finden. Wenn Sie dieses Element erreicht haben, müssen Sie zwei Schleifen verlassen. Fügen Sie dazu ein Label (also einen Bezeichner gefolgt von einem Doppelpunkt) vor der äußeren Schleife hinzu. Eine break-Anweisung mit Label springt hinter die mit dem Label versehene Schleife:
let i = 0
let j = 0
outer:
while (i < arr.length) {
while (j < arr[i].length) {
if (arr[i][j] < 0) break outer
j++
}
i++
j = 0
}
// Wird nach break outer oder dem regulären Ende beider Schleifen erreicht
Das Label der break-Anweisung muss sich dabei in derselben Zeile befinden wie das Schlüsselwort break. Mit Labels versehene break-Anweisungen sind jedoch nicht gebräuchlich.
Außerdem gibt es noch die Anweisung continue, die ebenso wie break den regulären Steuerungsfluss unterbricht. Sie übergibt die Steuerung an das Ende der innersten einschließenden Schleife. Das folgende Beispiel berechnet den Durchschnitt der positiven Elemente eines Arrays:
let count = 0
let sum = 0
for (let i = 0; i < arr.length; i++) {
if (arr[i] <= 0) continue
count++
sum += arr[i]
}
let avg = count === 0 ? 0 : sum / count
Ist ein Element nicht positiv, springt die Anweisung continue unmittelbar in den Kopf der Schleife und überspringt den Rest der aktuellen Iteration.
In einer for-Schleife wie in dem vorstehenden Beispiel springt die Anweisung continue zum Aktualisierungsteil der Schleife.
Es gibt auch eine Version von continue mit Label, die zum Ende der Schleife mit dem übereinstimmenden Label springt. Solche Anweisungen sind jedoch äußerst unüblich.
Viele Programmierer halten break und continue für verwirrend. Da sich diese Anweisungen auch einfach vermeiden lassen, verwende ich sie in diesem Buch nicht.
2.12Ausnahmen abfangen
Einige Methoden geben einen Fehlerwert zurück, wenn sie mit ungültigen Argumenten aufgerufen werden. Beispielsweise gibt parseFloat('') den Wert NaN zurück. Es ist jedoch nicht immer sinnvoll, einen Fehlerwert zurückzugeben. Es kann auch weniger offensichtliche