JavaScript für Ungeduldige. Cay Horstmann
Чтение книги онлайн.
Читать онлайн книгу JavaScript für Ungeduldige - Cay Horstmann страница 23
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
2.10.3Die for-in-Schleife
Mit for of ist es nicht möglich, die Eigenschaftswerte eines beliebigen Objekts zu durchlaufen. Aber das ist meistens auch gar nicht sinnvoll, da die Werte ohne die Schlüssel gewöhnlich bedeutungslos sind. Dagegen können Sie mit for in die Schlüssel durchlaufen:
let obj = { name: 'Harry Smith', age: 42 }
for (const key in obj)
console.log(`${key}: ${obj[key]}`)
Diese Schleife gibt age: 42 und name: Harry Smith in einer ungewissen Reihenfolge aus.
Die for-in-Schleife durchläuft die Schlüssel eines gegebenen Objekts. Wie Sie in Kapitel 4 und 8 noch sehen werden, werden dabei Prototypen-Eigenschaften berücksichtigt, nicht aufzählbare Eigenschaften aber übersprungen. Die Reihenfolge, in der die Schlüssel durchlaufen werden, hängt von der Implementierung ab, sodass Sie sich nicht darauf verlassen können.
Hinweis
Die for-of-Schleife von JavaScript entspricht der verallgemeinerten for-Schleife in Java, die auch als for-each-Schleife bezeichnet wird. Die for-in-Schleife von JavaScript hat dagegen kein Gegenstück in Java.
Mit einer for-in-Schleife können Sie die Eigenschaftennamen eines Arrays durchlaufen:
let numbers = [1, 2, , 4]
numbers[99] = 100
for (const i in numbers)
console.log(`${i}: ${numbers[i]}`)
Diese Schleife setzt i nacheinander auf '0', '1', '3' und '99'. Beachten Sie, dass die Schlüssel der Eigenschaften wie bei allen JavaScript-Objekten Strings sind. Auch wenn gängige JavaScript-Implementierungen Arrays in numerischer Reihenfolge durchlaufen, ist es am besten, sich nicht darauf zu verlassen. Wenn es auf die Iterationsreihenfolge ankommt, sollten Sie am besten for of oder die klassische for-Schleife verwenden.
Vorsicht
Ausdrücke wie numbers[i + 1] können in einer for-in-Schleife gefährlich sein:
if (numbers[i] === numbers[i + 1]) // Fehler! i + 1 ist '01', '11' usw.
In dieser Bedingung werden nicht etwa benachbarte Elemente verglichen. Da i einen String enthält, handelt es sich bei + um den Stringverkettungsoperator. Wenn i gleich '0' ist, ergibt i + 1 den Wert '01'.
Um dieses Problem zu lösen, wandeln Sie den String i in eine Zahl um:
if (numbers[i] === numbers[parseInt(i)+ 1])
Alternativ verwenden Sie die klassische for-Schleife.
Wenn Sie dem Array weitere Eigenschaften hinzufügen, werden natürlich auch diese aufgesucht:
numbers.lucky = true
for (const i in numbers) // i is '0', '1', '3', '99', 'lucky'
console.log(`${i}: ${numbers[i]}`)
Wie Sie in Kapitel 4 sehen werden, ist es möglich, dass externer Code aufzählbare Eigenschaften zu Array.prototype oder Object.prototype hinzufügt, die dann in einer for-in-Schleife sichtbar werden. Daher wird diese Praxis in der modernen JavaScript-Etikette strengstens abgelehnt. Dennoch warnen einige Programmierer davor, for-in-Schleifen zu verwenden, da Sie sich Sorgen über veraltete Bibliotheken oder Kollegen machen,