Erfahren Sie mehr über JavaScript-Iteratoren

Erfahren Sie mehr über JavaScript-Iteratoren

Einführung

Iterator ist ein Entwurfsmuster, das Containerobjekte wie verknüpfte Listen und Arrays durchlaufen kann, ohne sich um die Implementierungsdetails der Speicherzuweisung von Containerobjekten kümmern zu müssen. Das einfache Verständnis besteht darin, dass wir die Daten einzeln abrufen können, wie bei einem sich bewegenden Zeiger, der uns jedoch anzeigt, wann sie enden. Auf diese Weise können wir tun, was wir tun müssen, nachdem wir die Daten erhalten haben.

Wie sieht ein Iterator in js aus

In JavaScript ist ein Iterator ein spezielles Objekt. Dieses Iteratorobjekt hat eine next()-Methode und jeder Aufruf gibt ein Objekt (Ergebnisobjekt) zurück. Das Ergebnisobjekt hat zwei Attribute: eines ist value, das den nächsten zurückzugebenden Wert angibt; das andere ist done, ein Boolescher Wert. Wenn der letzte Wert in der Sequenz iteriert wurde, ist es true. Der Iterator speichert außerdem einen internen Zeiger auf die Position des Wertes in der aktuellen Sammlung. Jeder Aufruf der Methode next() gibt den nächsten verfügbaren Wert zurück, ähnlich der Struktur des Objekts unten.

{
  weiter: Funktion () {
        zurückkehren {
            Wert:'',
            erledigt: wahr / falsch
        }  
    }
}

Iterationsprotokoll

Da sich die Fähigkeiten der JavaScript-Sprache ständig verbessern, wurden einige neue Datentypen hinzugefügt, z. B. Map, Set, WeakMap usw. Um eine einheitliche Iteration dieser verschiedenen Datenstrukturen zu ermöglichen, hat es6 das Iterationsprotokoll hinzugefügt.

Das Iterationsprotokoll ist keine neue integrierte Implementierung oder Syntax; es ist ein Protokoll. Diese Protokolle können von jedem Objekt implementiert werden, das bestimmte Konventionen befolgt.

Das Iterationsprotokoll ist speziell in zwei Protokolle unterteilt: das iterierbare Protokoll und das Iteratorprotokoll.

Das einfache Verständnis ist, dass in js jedes Objekt durchlaufen werden kann, solange es das Iterationsprotokoll erfüllt.

Iterierbares Protokoll

Um iterierbar zu sein, muss ein Objekt die Methode @@iterator implementieren. Dies bedeutet, dass das Objekt (oder ein Objekt in seiner Prototypenkette) eine Eigenschaft mit dem Schlüssel @@iterator haben muss, auf die über die Konstante Symbol.iterator zugegriffen werden kann:

Einfach ausgedrückt: Wenn etwas durchquerbar sein soll, muss es einen @@iterator haben, auf den über Symbol.iterator zugegriffen werden kann.

Eigentum

Wert

[Symbol.Iterator]

Eine Funktion ohne Argumente, die ein Objekt zurückgibt, das dem Iteratorprotokoll entspricht.

Iterator-Protokoll

Das Iteratorprotokoll definiert eine Standardmethode zum Erstellen einer endlichen oder unendlichen Wertefolge. Wenn der Wert endlich ist, wird nach der Iteration aller Werte ein Standardrückgabewert zurückgegeben.

Ein Objekt entspricht nur dann dem Iteratorprotokoll, wenn es eine next()- Methode mit der folgenden Semantik implementiert:

Eigentum

Wert

nächste

Eine Funktion ohne Parameter, die ein Objekt zurückgibt, das die folgenden zwei Eigenschaften haben sollte:

erledigt (Boolesch)

Die Methode next() muss ein Objekt mit zwei Eigenschaften zurückgeben: done und value. Wenn ein Nicht-Objektwert (wie false oder undefined) zurückgegeben wird, wird eine Ausnahme ausgelöst („iterator.next() hat einen Nicht-Objektwert zurückgegeben“).

Iterativer Prozess

Wenn ein Objekt iteriert werden muss (z. B. wenn es in eine for...of-Schleife geschrieben wird), wird zuerst seine @@iterator-Methode ohne Parameter aufgerufen ( die zu diesem Zeitpunkt zurückgegebene Struktur ist { next: function () { }} ), und dann wird der von dieser Methode zurückgegebene Iterator verwendet, um den zu iterierenden Wert zu erhalten (tatsächlich wird diese next()-Methode nur wiederholt aufgerufen).

Iterationszusammenfassung

Das Iterationsprotokoll kann wie folgt zusammengefasst werden: Um etwas zu durchlaufen, muss es das Iterable-Protokoll und das Iterator-Protokoll erfüllen.

  • Iterierbares Protokoll: Dieses Objekt muss einen @@Iterator haben, auf den über Symbol.iterator zugegriffen werden kann
  • Iteratorprotokoll: Dies ist ein Objekt, dessen Funktion next() ein Objekt mit zwei Attributen zurückgibt: value und done (Boolesch, ob es das letzte Element ist. Wenn done wahr ist, kann value weggelassen werden).

Mit anderen Worten ist das Iteratorobjekt im Wesentlichen ein Zeigerobjekt. Der Zeiger wird durch die next()-Methode des Zeigerobjekts bewegt.

Benutzerdefinierte Iteration

Objekte implementieren keine Iteratoren, daher können Objekte nicht durchlaufen werden. Um eine Objektdurchquerung zu implementieren, müssen wir den oben erwähnten Iterator auf dem Objekt implementieren. Normalerweise gibt es zwei Schreibweisen. Eine ist die traditionelle Schreibweise, bei der Sie den internen Status selbst steuern müssen. Die andere besteht darin, den Iterator des Generators zu verwenden, der von der Generatorfunktion zurückgegeben wird, um ihn zu implementieren. Der Code lautet wie folgt:

Traditionelles Schreiben

lass obj = {
  Name: 'Joel',
  Adresse: 'gz',
  [Symbol.iterator]: () => {
     // Verwenden Sie dies hier nicht, da es sich um eine Rückgabefunktion handelt. Dies geht verloren. let index = -1, atrrList = Object.keys(obj);
    const objIterator = {
      weiter: () => {
        let result = ''
        Index++
        wenn (Index < atrrList.Länge) {
          Ergebnis = {
            Wert: atrrList[index],
            erledigt: falsch
          }
        } anders {
          Ergebnis = {
            erledigt: wahr
          }
        }
        Ergebnis zurückgeben
      }
    }
    Rückgabewert für ObjektIterator
  }
}

für (const item of obj) {
    Konsole.log('atrrs:' + Element + ',Wert:' + Objekt[Element])
}

Generatorfunktion schreiben

// Füge einen Iterator für ein nicht iterierbares Objekt hinzu let obj = {
  ein: 1,
  b: 2
}
obj[Symbol.iterator] = Funktion* () {
  Lassen Sie Schlüssel = Objekt.Schlüssel(obj);
  //Länge des Schlüsselwerts abrufen let len ​​​​= keys.length;
  //Schleifenvariable definieren let n = 0;
  //Bedingte Beurteilung while (n <= len - 1) {
      Ertrag { k: Schlüssel[n], v: Objekt[Schlüssel[n]] };
      n++
  }
}
//Der zurückgegebene Wert ist der Schlüssel und der Wert eines Objekts
für (sei { k, v } von obj) {
  konsole.log(k, v);
}

Für weitere zugehörige Informationen wie integrierte iterierbare Objekte, Syntax für iterierbare Objekte, integrierte APIs, die iterierbare Objekte akzeptieren usw. klicken Sie bitte hier.

Dies ist das Ende dieses Artikels zum Erlernen von JavaScript-Iteratoren. Weitere relevante Inhalte zu JavaScript-Iteratoren finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • JavaScript-Entwurfsmuster Iteratormuster
  • Bedeutung und Verwendung von JavaScript-Iteratoren
  • JavaScript-Entwurfsmuster Iteratormuster
  • JavaScript-Array-Iterationsmethoden
  • Detaillierte Erklärung von Javascript-Iteratoren und iterativen Schnittstellen

<<:  Implementierung der Bindungskonfiguration für duale Netzwerkkarten im Linux-System

>>:  Beispiele für den Import und Export von MySQL-Tabellendaten

Artikel empfehlen

Mysql-Timeline-Daten, um die ersten drei Daten desselben Tages zu erhalten

Erstellen von Tabellendaten CREATE TABLE `praise_...

Der Prozess der Installation von MySQL 8.0.26 auf CentOS7

1. Laden Sie zunächst die entsprechende Datenbank...

Empfehlen Sie einen coolen blinkenden Alarmknopf

Die Wirkung ist wie folgt: Der Code lautet wie fo...

Zabbix konfiguriert DingTalks Alarmfunktion mit Bildern

Umsetzungsideen: Zunächst müssen die Alarminforma...

So erlauben Sie den Remotezugriff auf offene Ports in Linux

1. Ändern Sie die Firewall-Konfigurationsdatei # ...

Eine detaillierte Einführung in die CSS-Namensspezifikation BEM von QQtabBar

BEM von QQtabBar Zunächst einmal: Was bedeutet BE...

So stellen Sie HTTPS kostenlos auf Tencent Cloud bereit

Als ich kürzlich ein WeChat-Applet schrieb, erfor...

Eine kurze Analyse von Linux resolv.conf

1. Einleitung resolv.conf ist die Konfigurationsd...

js Array fill() Füllmethode

Inhaltsverzeichnis 1. fill()-Syntax 2. Verwendung...

So optimieren Sie die MySQL-Abfragegeschwindigkeit

In den vorherigen Kapiteln haben wir die Auswahl ...

Detaillierte Erklärung der drei Möglichkeiten zum Festlegen von Rahmen in HTML

Drei Möglichkeiten zum Festlegen von Rahmen in HT...

Nginx-Weiterleitung basierend auf URL-Parametern

Anwendungsszenarien: Der Sprungpfad muss entsprec...

MySQL Flush-List und Flushing-Mechanismus für Dirty Pages

1. Überprüfung Der Pufferpool wird nach dem Start...

So erstellen Sie Ihre eigene Angular-Komponentenbibliothek mit DevUI

Inhaltsverzeichnis Vorwort Erstellen einer Kompon...