Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Iterator

Baseline
Weitgehend verfügbar
*

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2016 browserübergreifend verfügbar.

* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.

Ein Iterator-Objekt ist ein Objekt, das dem Iterator-Protokoll entspricht, indem es eine next()-Methode bereitstellt, die ein Iterator-Ergebnisobjekt zurückgibt. Alle eingebauten Iteratoren erben von der Iterator-Klasse. Die Iterator-Klasse bietet eine [Symbol.iterator]()-Methode, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterierbar wird. Sie bietet auch einige Hilfsmethoden zur Arbeit mit Iteratoren.

Beschreibung

Die folgenden sind alle eingebauten JavaScript-Iteratoren:

Web-APIs können ebenfalls Iteratoren zurückgeben. Einige verwenden JavaScript-Standard-Iteratoren, während andere ihre eigenen Iteratoren definieren. Zum Beispiel:

  • Array-ähnliche Objekte wie NodeList geben einen Array Iterator von ihren Methoden keys(), values(), entries() und [Symbol.iterator]() zurück.
  • Map-ähnliche Objekte von Web-APIs wie Headers geben ihren eigenen Iteratortyp wie Headers Iterator von ihren Methoden keys(), values(), entries() und [Symbol.iterator]() zurück.
  • Set-ähnliche Objekte von Web-APIs wie FontFaceSet geben ihren eigenen Iteratortyp wie FontFaceSet Iterator von ihren Methoden keys(), values(), entries() und [Symbol.iterator]() zurück.

Hinweis: NodeIterator und andere alte Schnittstellen sind so benannt, entsprechen jedoch nicht dem Iterator-Protokoll oder dem iterierbaren Protokoll.

Jeder dieser Iteratoren hat ein eindeutiges Prototypobjekt, das die next()-Methode definiert, die von dem bestimmten Iterator verwendet wird. Beispielsweise erben alle String-Iterator-Objekte von einem versteckten Objekt StringIteratorPrototype, das eine next()-Methode hat, die diesen String durch Codepunkte iteriert. StringIteratorPrototype hat auch eine [Symbol.toStringTag]-Eigenschaft, deren Anfangswert der String "String Iterator" ist. Diese Eigenschaft wird in Object.prototype.toString() verwendet. Ebenso haben andere Iterator-Prototypen auch ihre eigenen [Symbol.toStringTag]-Werte, die den oben genannten Namen entsprechen.

Alle diese Prototypobjekte erben von Iterator.prototype, das eine [Symbol.iterator]()-Methode bietet, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auch iterierbar wird.

Iterator-Hilfsmethoden

Hinweis: Diese Methoden sind Iterator-Hilfen, keine iterierbaren Hilfen, da die einzige Voraussetzung, damit ein Objekt iterierbar ist, nur die Anwesenheit einer [Symbol.iterator]()-Methode ist. Es gibt keinen gemeinsamen Prototyp, um diese Methoden zu installieren.

Die Iterator-Klasse selbst bietet einige Hilfsmethoden zur Arbeit mit Iteratoren. Zum Beispiel könnten Sie versucht sein, Folgendes zu tun:

js
const nameToDeposit = new Map([
  ["Anne", 1000],
  ["Bert", 1500],
  ["Carl", 2000],
]);

const totalDeposit = [...nameToDeposit.values()].reduce((a, b) => a + b);

Dies wandelt zuerst den von Map.prototype.values() zurückgegebenen Iterator in ein Array um und verwendet dann die Array.prototype.reduce()-Methode, um die Summe zu berechnen. Dadurch wird jedoch sowohl ein Zwischenarray erstellt als auch das Array zweimal iteriert. Stattdessen können Sie die reduce()-Methode des Iterators selbst verwenden:

js
const totalDeposit = nameToDeposit.values().reduce((a, b) => a + b);

Diese Methode kann effizienter sein, insbesondere in Bezug auf den Speicherverbrauch, da sie den Iterator nur einmal durchläuft, ohne Zwischenwerte zu speichern. Iterator-Hilfsmethoden sind notwendig, um mit unendlichen Iteratoren zu arbeiten:

js
function* fibonacci() {
  let current = 1;
  let next = 1;
  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}

const seq = fibonacci();
const firstThreeDigitTerm = seq.find((n) => n >= 100);

Sie können seq nicht in ein Array umwandeln, da es unendlich ist. Stattdessen können Sie die find()-Methode des Iterators selbst verwenden, die seq nur so weit wie nötig durchläuft, um den ersten Wert zu finden, der die Bedingung erfüllt.

Sie finden viele Iterator-Methoden analog zu Array-Methoden, wie zum Beispiel:

Iterator-Methode Array-Methode
Iterator.prototype.every() Array.prototype.every()
Iterator.prototype.filter() Array.prototype.filter()
Iterator.prototype.find() Array.prototype.find()
Iterator.prototype.flatMap() Array.prototype.flatMap()
Iterator.prototype.forEach() Array.prototype.forEach()
Iterator.prototype.includes() Array.prototype.includes()
Iterator.prototype.join() Array.prototype.join()
Iterator.prototype.map() Array.prototype.map()
Iterator.prototype.reduce() Array.prototype.reduce()
Iterator.prototype.some() Array.prototype.some()

Iterator.prototype.drop() und Iterator.prototype.take() zusammen sind in gewissem Sinne analog zu Array.prototype.slice().

Iterator-Hilfeobjekte

Hinweis: Iterator-Hilfeobjekte und Iterator-Hilfsmethoden sind zwei verschiedene Konzepte. Ein Iterator-Hilfeobjekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für eine Sammlung von Methoden zum Verständnis ist. Iterator-Hilfe kann je nach Kontext entweder auf das Objekt oder die Methode verweisen.

Unter den Iterator-Hilfsmethoden geben filter(), flatMap(), map(), drop() und take() ein neues Iterator-Hilfeobjekt zurück. Der Iterator-Helfer ist auch eine Instanz von Iterator, was diese Hilfsmethoden verkettbar macht. Alle Iterator-Hilfeobjekte erben von einem gemeinsamen Prototypobjekt, das das Iterator-Protokoll implementiert:

next()

Ruft die next()-Methode des zugrunde liegenden Iterators auf, wendet die Hilfsmethode auf das Ergebnis an und gibt das Ergebnis zurück.

return()

Ruft die return()-Methode des zugrunde liegenden Iterators auf und gibt das Ergebnis zurück.

Der Iterator-Helfer teilt die gleiche Datenquelle wie der zugrunde liegende Iterator, sodass das Iterieren des Iterator-Helfers auch das Iterieren des zugrunde liegenden Iterators bewirkt. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrmals iterieren zu können.

js
const it = [1, 2, 3].values();
const it2 = it.drop(0); // Essentially a copy
console.log(it.next().value); // 1
console.log(it2.next().value); // 2
console.log(it.next().value); // 3

Richtige Iteratoren

Es gibt zwei Arten von "Iteratoren": Objekte, die dem Iterator-Protokoll entsprechen (was in der Minimalform nur die Anwesenheit einer next()-Methode erfordert), und Objekte, die von der Iterator-Klasse erben, die die Hilfsmethoden genießen. Sie beschleunigen einander nicht — Objekte, die von Iterator erben, werden nicht automatisch zu Iteratoren, da die Iterator-Klasse keine next()-Methode definiert. Stattdessen muss das Objekt selbst eine next()-Methode definieren. Ein richtiger Iterator ist einer, der sowohl dem Iterator-Protokoll entspricht als auch von Iterator erbt, und die meisten Codes erwarten, dass Iteratoren richtige Iteratoren sind und Iterables richtige Iteratoren zurückgeben. Um richtige Iteratoren zu erstellen, definieren Sie eine Klasse, die von Iterator erweitert, oder verwenden Sie die Iterator.from()-Methode.

js
class MyIterator extends Iterator {
  next() {
    // …
  }
}

const myIterator = Iterator.from({
  next() {
    // …
  },
});

Konstruktor

Iterator()

Soll von anderen Klassen, die Iteratoren erstellen, erweitert werden. Gibt einen Fehler zurück, wenn es alleine konstruiert wird.

Statische Methoden

Iterator.concat()

Erstellt ein neues Iterator-Objekt aus einer Liste von iterierbaren Objekten. Der neue Iterator gibt die Werte der Eingabe-Iterables der Reihe nach zurück.

Iterator.from()

Erstellt ein neues Iterator-Objekt aus einem Iterator oder iterierbaren Objekt.

Iterator.zip()

Erstellt ein neues Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem es Arrays zurückgibt, die Elemente an derselben Position enthalten.

Iterator.zipKeyed()

Erstellt ein neues Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem es Objekte zurückgibt, die Elemente an derselben Position mit von der Eingabe spezifizierten Schlüsseln enthalten.

Instanzeigenschaften

Diese Eigenschaften sind auf Iterator.prototype definiert und werden von allen Iterator-Instanzen gemeinsam genutzt.

Iterator.prototype.constructor

Die Konstruktorfunktion, die das Instanzobjekt erstellt hat. Für Iterator-Instanzen ist der Anfangswert der Iterator-Konstruktor.

Iterator.prototype[Symbol.toStringTag]

Der Anfangswert der [Symbol.toStringTag]-Eigenschaft ist der String "Iterator". Diese Eigenschaft wird in Object.prototype.toString() verwendet.

Hinweis: Im Gegensatz zu [Symbol.toStringTag] in den meisten eingebauten Klassen ist Iterator.prototype[Symbol.toStringTag] aus Gründen der Web-Kompatibilität beschreibbar.

Instanzmethoden

Iterator.prototype.chunks()

Gibt ein neues Iterator-Hilfeobjekt zurück, das die Elemente aus dem ursprünglichen Iterator in aufeinanderfolgende Array-Chunks aufteilt. Jedes Mal, wenn der Helfer iteriert wird, erhält er die angegebene Anzahl von Elementen aus dem zugrunde liegenden Iterator und gibt sie zusammen zurück.

Iterator.prototype.drop()

Gibt ein neues Iterator-Hilfeobjekt zurück, das die angegebene Anzahl von Elementen am Anfang dieses Iterators überspringt.

Iterator.prototype.every()

Gibt false zurück, wenn es ein Element findet, das die bereitgestellte Testfunktion nicht erfüllt. Andernfalls, wenn der Iterator erschöpft ist, ohne ein solches Element zu finden, gibt es true zurück.

Iterator.prototype.filter()

Gibt ein neues Iterator-Hilfeobjekt zurück, das nur die Elemente des Iterators liefert, für die die bereitgestellte Rückruffunktion true zurückgibt.

Iterator.prototype.find()

Gibt das erste vom Iterator produzierte Element zurück, das die bereitgestellte Testfunktion erfüllt. Wenn keine Werte die Testfunktion erfüllen, wird undefined zurückgegeben.

Iterator.prototype.flatMap()

Gibt ein neues Iterator-Hilfeobjekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Abbildungsfunktion laufen lässt und die Elemente zurückgibt, die von der Abbildungsfunktion zurückgegeben werden (die in einem anderen Iterator oder iterierbaren Objekt enthalten sind).

Iterator.prototype.forEach()

Führt eine bereitgestellte Funktion einmal für jedes vom Iterator produzierte Element aus.

Iterator.prototype.includes()

Gibt true zurück, wenn ein vom Iterator produziertes Element dem gegebenen Wert entspricht. Andernfalls, wenn der Iterator erschöpft ist, ohne ein solches Element zu finden, gibt es false zurück.

Iterator.prototype.join()

Gibt einen String zurück, der die Verkettung aller vom Iterator produzierten Elemente ist, getrennt durch Kommata oder einen angegebenen Trennstring.

Iterator.prototype.map()

Gibt ein neues Iterator-Hilfeobjekt zurück, das Elemente des Iterators liefert, die jeweils durch eine Abbildungsfunktion transformiert wurden.

Iterator.prototype.reduce()

Führt eine benutzerdefinierte "Reducer"-Rückruffunktion auf jedes durch den Iterator produzierte Element aus, wobei der Rückgabewert der Berechnung des vorherigen Elements übergeben wird. Das endgültige Ergebnis der Ausführung des Reducers über alle Elemente ist ein einziger Wert.

Iterator.prototype.some()

Gibt true zurück, wenn es ein Element findet, das die bereitgestellte Testfunktion erfüllt. Andernfalls, wenn der Iterator erschöpft ist, ohne ein solches Element zu finden, gibt es false zurück.

Iterator.prototype.take()

Gibt ein neues Iterator-Hilfeobjekt zurück, das die angegebene Anzahl von Elementen in diesem Iterator liefert und dann beendet.

Iterator.prototype.toArray()

Erstellt eine neue Array-Instanz, die mit den vom Iterator gelieferten Elementen gefüllt ist.

Iterator.prototype.windows()

Gibt ein neues Iterator-Hilfeobjekt zurück, das ein gleitendes Fenster von Elementen liefert. Jedes Mal, wenn der Helfer iteriert wird, liefert er ein Array, das das erste Element von der vorherigen Iteration entfernt und das nächste Element vom ursprünglichen Iterator hinzufügt.

Iterator.prototype[Symbol.dispose]()

Ruft die return()-Methode von this auf, falls sie existiert. Dies implementiert das disposable protocol und ermöglicht es, es zu entsorgen, wenn es mit using oder await using verwendet wird.

Iterator.prototype[Symbol.iterator]()

Gibt das Iterator-Objekt selbst zurück. Dadurch können Iterator-Objekte auch iterierbar sein.

Beispiele

Verwendung eines Iterators als iterierbares Objekt

Alle eingebauten Iteratoren sind auch iterierbar, daher können Sie sie in einer for...of-Schleife verwenden:

js
const arrIterator = [1, 2, 3].values();
for (const value of arrIterator) {
  console.log(value);
}
// Logs: 1, 2, 3

Spezifikationen

Spezifikation
ECMAScript® 2027 Language Specification
# sec-iterator-objects

Browser-Kompatibilität

Siehe auch