JavaScript – Das Handbuch für die Praxis. David Flanagan

JavaScript  –  Das Handbuch für die Praxis - David Flanagan


Скачать книгу
++ oder -- verwendet.

      Wir können die Zahlen von 0 bis 9 beispielsweise mit folgender for-Schleife ausgeben. Vergleichen Sie sie mit der äquivalenten while-Schleife, die im vorherigen Abschnitt gezeigt wurde:

      for(let count = 0; count < 10; count++) {

      console.log(count);

      }

      Schleifen können natürlich erheblich komplexer werden als die in diesem einfachen Beispiel, und manchmal ändern sich bei jeder Iteration gleich mehrere Variablen. Das ist die einzige Situation, in der in JavaScript gemeinhin der Kommaoperator zum Einsatz kommt. Mit ihm lassen sich mehrere Initialisierungs- und Inkrementierungsausdrücke zu einem einzigen Ausdruck kombinieren, der dann in einer for-Schleife verwendet werden kann:

      let i, j, sum = 0;

      for(i = 0, j = 10 ; i < 10 ; i++, j--) {

      sum += i * j;

      }

      In allen bisherigen Beispielen für Schleifen war die Schleifenvariable numerisch. Das ist zwar üblich, aber nicht zwingend erforderlich. Im folgenden Code wird mit einer for-Schleife eine verkettete Liste (Linked List) durchlaufen und das letzte Objekt der Liste zurückgegeben (d.h. das erste Objekt, das keine next-Eigenschaft hat):

      function tail(o) { // Rückgabe des letzten Objekts

      // der verketteten Liste o.

      for(; o.next; o = o.next) /* leer */ ; // Durchlaufen, solange o.next

      // truthy ist.

      return o;

      }

      Beachten Sie bitte, dass der gezeigte Code keinen Initialisierungsausdruck aufweist. Jeder der oben erläuterten drei Ausdrücke kann bei einer for-Schleife weggelassen werden, aber die beiden Semikola sind erforderlich. Lassen Sie den Ausdruck Prüfung weg, läuft die Schleife endlos. for(;;) ist also neben while(true) eine weitere Möglichkeit, eine Endlosschleife zu formulieren.

       5.4.4for/of

      In ES6 wurde eine weitere Schleifenanweisung eingeführt: for/of. Diese neue Art von Schleife nutzt zwar das Schlüsselwort for, unterscheidet sich aber deutlich von der gewöhnlichen for-Schleife. (Sie ist auch völlig anders als die ältere for/in-Schleife, die wir in 5.4.5 behandeln.)

      Die for/of-Schleife arbeitet mit iterierbaren Objekten. Was genau es für ein Objekt bedeutet, iterierbar zu sein, besprechen wir in Kapitel 12. In diesem Kapitel und an dieser Stelle ist nur die Tatsache wichtig, dass Arrays, Strings, Sets und Maps iterierbar sind: Sie alle sind eine Folge oder Menge von Elementen, die man mit einer for/of-Schleife durchlaufen kann.

      Das folgende Beispiel veranschaulicht, wie wir mit for/of die Elemente eines Arrays von Zahlen in einer Schleife durchlaufen und ihre Summe berechnen können:

      let data = [1, 2, 3, 4, 5, 6, 7, 8, 9], sum = 0;

      for(let element of data) {

      sum += element;

      }

      sum // => 45

      Oberflächlich betrachtet, ähnelt die Syntax einer normalen for-Schleife: Auf das for-Schlüsselwort folgt ein Paar runder Klammern, die die Einzelheiten darüber enthalten, was die Schleife tun soll. In diesem Fall enthalten die Klammern eine Variablendeklaration (bei bereits deklarierten Variablen ansonsten einfach den Namen der Variablen), gefolgt vom Schlüsselwort of und einem Ausdruck, der ein iterierbares Objekt auswertet, wie in diesem Fall das Array data. Wie bei allen Schleifen folgt der Körper einer for/of-Schleife auf die runden Klammern, umschlossen von geschweiften Klammern.

      In unserem Beispiel wird der Schleifenkörper für jedes Element des Arrays data einmal ausgeführt. Vor jeder Ausführung wird jeweils das nächste Element des Arrays der Elementvariablen zugewiesen. Dabei wird das Array der Reihe nach vom ersten bis zum letzten Element durchlaufen.

      Arrays werden »live« iteriert – Änderungen, die während des Durchlaufs vorgenommen werden, können das Ergebnis der Iteration beeinflussen. Fügen wir in obigem Code die Zeile data.push(sum); innerhalb des Schleifenkörpers hinzu, erzeugen wir damit eine Endlosschleife, da die Iteration niemals das letzte Element des Arrays erreichen kann.

       for/of mit Objekten

      Objekte sind (standardmäßig) nicht iterierbar. Der Versuch, for/of auf ein reguläres Objekt anzuwenden, löst zur Laufzeit einen TypeError aus:

      let o = { x: 1, y: 2, z: 3 };

      for(let element of o) { // Löst einen TypeError aus, da o nicht iterierbar ist.

      console.log(element);

      }

      Wenn Sie über die Eigenschaften eines Objekts iterieren wollen, können Sie eine for/in-Schleife (eingeführt in 5.4.5) oder for/of mit der Methode Object.keys() verwenden:

      let o = { x: 1, y: 2, z: 3 };

      let keys = "";

      for(let k of Object.keys(o)) {

      keys += k;

      }

      keys // => "xyz"

      Das funktioniert, weil Object.keys() ein Array der Eigenschaftsnamen eines Objekts zurückgibt und Arrays mit for/of iterierbar sind. Die Iteration über die Schlüssel eines Objekts erfolgt übrigens nicht live, anders als in dem früheren Beispiel, in dem wir ein Array von Zahlen durchlaufen haben: Änderungen am Objekt o, die im Schleifenkörper vorgenommen werden, wirken sich nicht auf die Iteration aus. Wenn Sie sich nicht für die Schlüssel eines Objekts interessieren, können Sie stattdessen auch über die entsprechenden Werte iterieren:

      let sum = 0;

      for(let v of Object.values(o)) {

      sum += v;

      }

      sum // => 6

      Und wenn Sie sowohl an den Schlüsseln als auch an den Werten der Eigenschaften eines Objekts interessiert sind, können Sie for/of mit Object.entries() und einer destrukturierenden Zuweisung verwenden:

      let pairs = "";

      for(let [k, v] of Object.entries(o)) {

      pairs += k + v;

      }

      pairs // => "x1y2z3"

      Object.entries() gibt ein verschachteltes Array zurück, wobei jedes innere Array ein Schlüssel/Wert-Paar einer Eigenschaft des Objekts darstellt. In diesem Codebeispiel verwenden wir eine destrukturierende Zuweisung, um die inneren Arrays in zwei einzelne Variablen zu entpacken.

       for/of mit Strings

      Strings sind in ES6 zeichenweise iterierbar:

      let frequency = {};

      for(let letter of "mississippi") {

      if (frequency[letter]) {

      frequency[letter]++;

      } else {

      frequency[letter] = 1;

      }

      }

      frequency // => {m: 1, i: 4, s: 4, p: 2}

      Beachten Sie bitte, dass Zeichenketten basierend auf Unicode-Codepoints durchlaufen werden, nicht anhand von UTF-16-Zeichen. Die Zeichenfolge »I Скачать книгу