Скачать книгу

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 Möglichkeiten geben, zwischen gültigen und ungültigen Werten zu unterscheiden. Die Methode parseFloat ist dafür ein gutes Beispiel. Der Aufruf parseFloat('NaN') gibt NaN zurück, der Aufruf parseFloat('Infinity') den Wert Infinity. Wenn parseFloat also NaN zurückgibt, können Sie nicht erkennen, ob die Methode den gültigen String 'NaN' oder ein ungültiges Argument untersucht hat.

      In JavaScript kann eine Methode auch einen alternativen Exit-Pfad nehmen, wenn sie nicht in der Lage ist, ihre Aufgabe auf reguläre Weise zu erledigen. Anstatt einen Wert zurückzugeben, kann sie auch eine Exception auslösen. In diesem Fall wird die Ausführung nicht mit dem Code fortgesetzt, der die Methode aufgerufen hat. Stattdessen wird eine catch-Klausel ausgeführt. Wird diese Exception nirgendwo mit einer solchen Klausel abgefangen, wird das Programm beendet.

      Um eine Exception abzufangen, verwenden Sie die Anweisung try. In ihrer einfachsten Form sieht sie wie folgt aus:

      try {

       Code

       mehr Code

       noch mehr Code

      } catch {

       Handler

      }

      Der der Code an irgendeiner Stelle innerhalb des try-Blocks eine Exception auslöst, überspringt das Programm den Rest des Blocks und führt stattdessen den Handler-Code in der catch-Klausel aus.

      Nehmen wir zum Beispiel an, Sie wollen einen empfangenen JSON-String parsen. Der Aufruf von JSON.parse löst eine Exception aus, wenn das Argument kein gültiger JSON-Code ist. Diese Exception können Sie in der catch-Klausel behandeln:

      let input = ... // Liest eine Eingabe aus irgendeiner Quelle

      try {

      let data = JSON.parse(input)

      // Wird die Ausführung hier fortgesetzt, ist die Eingabe gültig

      // Verarbeitet die Daten

      ...

      } catch {

      // Kümmert sich darum, dass die Eingabe ungültig ist

      ...

      }

      Im Handler können Sie die Information protokollieren, dass Ihnen ein ungültiger JSON-String übergeben wurde, oder sonstige Maßnahmen treffen, um mit dem Problem umzugehen.

      In Kapitel 3 sehen wir uns noch weitere Varianten von try-Anweisungen an, die Ihnen mehr Kontrolle über die Behandlung von Exceptions geben. Dort lernen Sie auch, wie Sie eigene Exceptions auslösen.

       2.13Übungen

      1 Browserkonsolen und die REPL von Node.js zeigen Werte an, wenn Sie Anweisungen eingeben. Welche Werte werden bei den folgenden Anweisungen ausgegeben?AusdrucksanweisungenVariablendeklarationenBlockanweisungen mit mindestens einer AnweisungLeere Blockanweisungenwhile-, do- oder for-Schleifen, deren Rumpf mindestens einmal ausgeführt wirdSchleifen, deren Rumpf nie ausgeführt wirdif-Anweisungentry-Anweisungen, die regulär beendet werdentry-Anweisungen, deren catch-Klausel ausgeführt wird

      2 Was ist bei der folgenden Anweisung falsch?if (x === 0) console.log('zero') else console.log('nonzero')Wie lösen Sie das Problem?

      3 Gegeben sei die folgende Anweisung:let x = aWelche Token am Anfang der nächsten Zeile können verhindern, dass ein Semikolon ergänzt wird? Welche können in einem Programm realistischerweise vorkommen?

      4 Was ergeben Vergleiche von undefined, null, 0 und '' mit den Operatoren <, <= und ==? Warum ist das so?

      5 Ist a || b unabhängig vom Typ von a und b immer dasselbe wie a ? a : b? Warum oder warum nicht? Geht das auch mit a && b?

      6 Verwenden Sie die drei Arten von for-Schleifen, um den größten Wert in einem Array aus Zahlen zu finden!

      7 Betrachten Sie folgenden Code:let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]for (i in arr) { if (i + 1 === 10) console.log(a[i]) }Warum wird hierbei nichts ausgegeben?

      8 Schreiben Sie eine switch-Anweisung, die die Ziffern 0 bis 9 in ihre englischen Bezeichnungen 'zero' bis 'nine' umwandelt. Wie können Sie dasselbe auch ganz einfach ohne switch erledigen? Wie sieht es mit der Rückverwandlung aus?

      9 Sei n eine Zahl zwischen 0 und 7. Setzen Sie die Array-Elemente arr[k] bis arr[k + n - 1] auf 0. Verwenden Sie dazu eine switch-Anweisung mit Durchlauf.

      10 Schreiben Sie die do-Schleife aus Abschnitt 2.9 »while- und do-Schleifen« als while-Schleife um.

      11 Schreiben Sie alle for-Schleifen aus Abschnitt 2.10 »for-Schleifen« als while-Schleifen um.

      12 Schreiben Sie das Beispiel mit der break-Anweisung mit Label aus Скачать книгу