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 stellt eine [Symbol.iterator]()-Methode bereit, die das Iterator-Objekt selbst zurückgibt und den Iterator auch iterierbar macht. Sie bietet auch einige Hilfsmethoden zur Arbeit mit Iteratoren.

Beschreibung

Die folgenden sind alle eingebaute JavaScript-Iteratoren:

Web-APIs können ebenfalls Iteratoren zurückgeben. Einige nutzen 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 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 FontFaceSet Iterator von ihren jeweiligen Methoden keys(), values(), entries() und [Symbol.iterator]() zurück.

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

Jeder dieser Iteratoren hat ein eigenes Prototypenobjekt, das die next()-Methode definiert, die vom jeweiligen Iterator verwendet wird. Zum Beispiel 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 die Zeichenkette "String Iterator" ist. Diese Eigenschaft wird in Object.prototype.toString() verwendet. Ähnlich haben andere Iterator-Prototypen auch ihre eigenen [Symbol.toStringTag]-Werte, die mit den oben angegebenen Namen übereinstimmen.

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

Iterator-Hilfsmethoden

Hinweis: Diese Methoden sind Iterator-Hilfen, keine iterierbaren Hilfen, da die einzige Anforderung an ein Objekt, um iterierbar zu sein, nur das Vorhandensein 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 den vom Map.prototype.values() zurückgegebenen Iterator zunächst in ein Array um und verwendet dann die Array.prototype.reduce()-Methode, um die Summe zu berechnen. Dies erstellt jedoch sowohl ein Zwischenarray als auch iteriert 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 irgendwelche Zwischenwerte zu merken. Iterator-Hilfsmethoden sind notwendig für die Arbeit mit unendlichen Iteratoren:

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 nötig, um den ersten Wert zu finden, der die Bedingung erfüllt.

Sie werden viele Iteratormethoden finden, die analogen Array-Methoden ähneln, 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 etwas analog zu Array.prototype.slice().

Iterator-Hilfsobjekte

Hinweis:>Iterator-Hilfsobjekte und Iterator-Hilfsmethoden sind zwei verschiedene Konzepte. Ein Iterator-Hilfsobjekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für einen Satz von Methoden für das Verständnis ist. Iterator-Hilfe kann je nach Kontext entweder das Objekt oder die Methode bezeichnen.

Unter den Iterator-Hilfsmethoden geben filter(), flatMap(), map(), drop() und take() ein neues Iterator-Hilfsobjekt zurück. Der Iterator-Helfer ist auch eine Iterator-Instanz, wodurch diese Hilfsmethoden verkettet werden können. Alle Iterator-Hilfsobjekte erben von einem gemeinsamen Prototyp-Objekt, 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 Iterieren des Iterator-Helfers dazu führt, dass der zugrunde liegende Iterator ebenfalls iteriert wird. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrfach zu iterieren.

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 im Minimum nur das Vorhandensein einer next()-Methode erfordert) und Objekte, die von der Iterator-Klasse erben, die die Hilfsmethoden nutzen können. Sie schließen sich nicht gegenseitig aus — 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 die meisten Code erwarten, dass Iteratoren richtige Iteratoren sind und Iterables richtige Iteratoren zurückgeben. Um korrekte Iteratoren zu erstellen, definieren Sie eine Klasse, die von Iterator erweitert oder die Iterator.from()-Methode verwendet.

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

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

Konstruktor

Iterator()

Soll von anderen Klassen erweitert werden, die Iteratoren erstellen. Wirft einen Fehler, wenn es selbst konstruiert wird.

Statische Methoden

Iterator.from()

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

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 die Zeichenkette "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] beschreibbar, aus Gründen der Webkompatibilität.

Instanzmethoden

Iterator.prototype.drop()

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

Iterator.prototype.every()

Testet, ob alle vom Iterator produzierten Elemente den durch die angegebene Funktion implementierten Test bestehen.

Iterator.prototype.filter()

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

Iterator.prototype.find()

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

Iterator.prototype.flatMap()

Gibt ein neues Iterator-Hilfsobjekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Zuordnungsfunktion laufen lässt und Elemente zurückgibt, die von der Zuordnungsfunktion zurückgegeben werden (welche sich in einem anderen Iterator oder iterable befinden).

Iterator.prototype.forEach()

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

Iterator.prototype.map()

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

Iterator.prototype.reduce()

Führt eine vom Benutzer bereitgestellte "Reducer"-Rückruffunktion auf jedes vom Iterator produzierte Element aus, indem der Rückgabewert aus der Berechnung des vorhergehenden Elements übergeben wird. Das Endergebnis des Reduzierens über alle Elemente hinweg ist ein einzelner Wert.

Iterator.prototype.some()

Testet, ob mindestens ein Element im Iterator den durch die angegebene Funktion implementierten Test besteht. Es gibt einen booleschen Wert zurück.

Iterator.prototype.take()

Gibt ein neues Iterator-Hilfsobjekt zurück, das die gegebene 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 befüllt wird.

Iterator.prototype[Symbol.iterator]()

Gibt das Iterator-Objekt selbst zurück. Dies ermöglicht es Iterator-Objekten, auch iterierbar zu sein.

Beispiele

Verwendung eines Iterators als Iterable

Alle eingebauten Iteratoren sind auch 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