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

So speichern Sie „false“ oder „true“ in MySQL

Boolescher MySQL-Wert, speichert „false“ oder „tr...

Vue CodeMirror realisiert den Effekt des Online-Code-Compilers

Vorwort Wenn wir den Effekt der Online-Codekompil...

So verwalten Sie Benutzer und Gruppen beim Ausführen von Docker

Docker ist ein Verwaltungstool, das Prozesse als ...

Detailliertes Tutorial zur Installation der MySQL 8.0.20-Datenbank auf CentOS 7

Weiterführende Literatur: MySQL8.0.20-Installatio...

So verwenden Sie den Flat Style zum Gestalten von Websites

Das Wesen einer flachen Website-Struktur liegt in...

Vue+SSH-Framework zur Realisierung von Online-Chat

In diesem Artikel wird der spezifische Code des V...

Verwenden Sie CSS, um einen kreisförmigen Welleneffekt zu erzielen

Auf Mobilgeräten sehe ich häufig kreisförmige Wel...

Tipps und Vorsichtsmaßnahmen zur Verwendung des MySQL-Index

1. Die Rolle des Index In allgemeinen Anwendungss...

MySql5.7.21 Installationspunkte Datensatznotizen

Die heruntergeladene Version ist die Zip-Dekompri...

Detaillierte Erklärung der Beziehung zwischen React und Redux

Inhaltsverzeichnis 1. Die Beziehung zwischen Redu...

Fortgeschrittene JavaScript-Programmierung: Variablen und Umfang

Inhaltsverzeichnis 1. Ursprungswert und Bezugswer...