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 Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

* Some parts of this feature may have varying levels of support.

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 und den Iterator somit ebenfalls iterierbar macht. Sie bietet auch einige Hilfsmethoden für die Arbeit mit Iteratoren.

Beschreibung

Die folgenden sind alle eingebauten JavaScript-Iteratoren:

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

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

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

Jeder dieser Iteratoren hat ein eigenes Prototypobjekt, das die next()-Methode definiert, die vom spezifischen Iterator verwendet wird. Zum Beispiel erben alle String-Iterator-Objekte von einem versteckten Objekt StringIteratorPrototype, das eine next()-Methode hat, die diesen String nach Codepunkten durchläuft. 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 identisch mit den oben gegebenen Namen sind.

Alle diese Prototypobjekte erben von Iterator.prototype, das eine [Symbol.iterator]()-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt und den Iterator somit ebenfalls iterierbar macht.

Iterator-Hilfsmethoden

Hinweis: Diese Methoden sind Iterator-Helfer, nicht iterierbare Helfer, da die einzige Anforderung, dass 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 für die Arbeit mit Iteratoren. Zum Beispiel könnte man 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 konvertiert zuerst den von Map.prototype.values() zurückgegebenen Iterator in ein Array und verwendet dann die Methode Array.prototype.reduce(), um die Summe zu berechnen. Dies erstellt jedoch sowohl ein Zwischenarray als auch durchläuft das Array zweimal. 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 speichermäßig, 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 durchläuft, wie es nötig ist, um den ersten Wert zu finden, der die Bedingung erfüllt.

Viele Iterator-Methoden sind analog zu Array-Methoden, wie z.B.:

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.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 gewisser Weise analog zu Array.prototype.slice().

Iterator-Helferobjekte

Hinweis: Iterator-Helferobjekte und Iterator-Hilfsmethoden sind zwei unterschiedliche Konzepte. Ein Iterator-Helferobjekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für eine Gruppe von Methoden zur Übersicht ist. Iterator-Helfer kann sich je nach Kontext entweder auf das Objekt oder die Methode beziehen.

Unter den Iterator-Hilfsmethoden geben filter(), flatMap(), map(), drop(), und take() ein neues Iterator Helper-Objekt zurück. Der Iterator-Helfer ist ebenfalls eine Instanz von Iterator, wodurch diese Hilfsmethoden kaskadierbar sind. Alle Iterator-Helferobjekte 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 dieselbe Datenquelle wie der zugrunde liegende Iterator, sodass das Durchlaufen des Iterator-Helfers auch den zugrunde liegenden Iterator durchläuft. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrmals zu durchlaufen.

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

Korrekte Iteratoren

Es gibt zwei Arten von "Iteratoren": Objekte, die dem Iterator-Protokoll entsprechen (was zumindest die Anwesenheit einer next()-Methode erfordert), und Objekte, die von der Iterator-Klasse erben und die Hilfsmethoden nutzen können. Sie schließen sich nicht gegenseitig ein — 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 korrekter Iterator ist einer, der sowohl dem Iterator-Protokoll entspricht als auch von Iterator erbt, und der in den meisten Codes als richtiger Iterator erwartet wird, um korrekte Iteratoren und Iterable zu erzeugen. Um korrekte Iteratoren zu erstellen, definieren Sie eine Klasse, die 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 erzeugen, erweitert werden. Löst einen Fehler aus, wenn er selbst konstruiert wird.

Statische Methoden

Iterator.concat()

Erstellt ein neues Iterator-Objekt aus einer Liste von iterierbaren Objekten. Der neue Iterator gibt die Werte aus jedem der Eingabeiterables der Reihe nach aus.

Iterator.from()

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

Iterator.zip() Experimentell

Erstellt ein neues Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem Arrays mit Elementen an derselben Position ausgegeben werden.

Iterator.zipKeyed() Experimentell

Erstellt ein neues Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten aggregiert, indem Objekte mit Elementen an derselben Position, mit den von der Eingabe angegebenen Schlüsseln, ausgegeben werden.

Instanzeigenschaften

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

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 zum [Symbol.toStringTag] bei den meisten eingebauten Klassen ist Iterator.prototype[Symbol.toStringTag] aus Gründen der Web-Kompatibilität beschreibbar.

Instanzmethoden

Iterator.prototype.drop()

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

Iterator.prototype.every()

Testet, ob alle vom Iterator erzeugten Elemente den Test bestehen, der von der bereitgestellten Funktion implementiert wurde.

Iterator.prototype.filter()

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

Iterator.prototype.find()

Gibt das erste vom Iterator erzeugte 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-Helferobjekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Mapping-Funktion läuft und Elemente ausgibt, die von der Mapping-Funktion zurückgegeben werden (die sich in einem anderen Iterator oder iterierbaren Objekt befinden).

Iterator.prototype.forEach()

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

Iterator.prototype.map()

Gibt ein neues Iterator-Helferobjekt zurück, das die Elemente des Iterators ausgibt, die jeweils von einer Mapping-Funktion transformiert werden.

Iterator.prototype.reduce()

Führt eine benutzerdefinierte "Reducer"-Rückruffunktion für jedes vom Iterator erzeugte Element aus, unter Verwendung des Rückgabewerts der Berechnung für das vorhergehende Element. Das Endergebnis der Ausführung des Reducers über alle Elemente ist ein einziger Wert.

Iterator.prototype.some()

Testet, ob mindestens ein Element im Iterator den Test besteht, der von der bereitgestellten Funktion implementiert wurde. Gibt einen booleschen Wert zurück.

Iterator.prototype.take()

Gibt ein neues Iterator-Helferobjekt zurück, das die angegebene Anzahl von Elementen in diesem Iterator ausgibt und dann endet.

Iterator.prototype.toArray()

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

Iterator.prototype[Symbol.dispose]()

Ruft die return()-Methode von this auf, falls vorhanden. Dies implementiert das Disposable-Protokoll und ermöglicht es, bei Verwendung mit using oder await using entsorgt zu werden.

Iterator.prototype[Symbol.iterator]()

Gibt das Iterator-Objekt selbst zurück. Dadurch werden Iterator-Objekte ebenfalls iterierbar.

Beispiele

Einen Iterator als iterierbar verwenden

Alle eingebauten Iteratoren sind ebenfalls iterierbar, sodass Sie sie in einer for...of Schleife verwenden können:

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

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-%iteratorprototype%-object

Browser-Kompatibilität

Siehe auch