JavaScript für Ungeduldige. Cay Horstmann. Читать онлайн. Newlib. NEWLIB.NET

Автор: Cay Horstmann
Издательство: Bookwire
Серия:
Жанр произведения: Математика
Год издания: 0
isbn: 9783969100943
Скачать книгу
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.

image

       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.

image

      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, die beliebigen Code aus dem Internet einfügen.

image

       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).

image

      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 image'

      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 image werden getrennt aufgesucht.

       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