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. Zudem bietet sie einige Hilfsmethoden zur Arbeit mit Iteratoren.

Beschreibung

Die folgenden sind alle eingebauten JavaScript-Iteratoren:

Auch Web-APIs können Iteratoren zurückgeben. Einige nutzen die Kern-JavaScript-Iteratoren, 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 ältere Schnittstellen sind so benannt, entsprechen jedoch weder dem Iterator-Protokoll noch dem iterierbaren Protokoll.

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

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

Iterator-Hilfsmethoden

Hinweis: Diese Methoden sind Iterator-Helfer, nicht iterierbare Helfer, da das einzige Erfordernis für ein Objekt, iterierbar zu sein, lediglich die Anwesenheit einer [Symbol.iterator]()-Methode ist. Es gibt keinen gemeinsamen Prototyp, auf dem diese Methoden installiert werden könnten.

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);

Diese erste Methode konvertiert den Iterator, der von Map.prototype.values() zurückgegeben wird, in ein Array und verwendet dann die Array.prototype.reduce()-Methode, um die Summe zu berechnen. Dies führt jedoch dazu, dass ein Zwischen-Array erstellt wird und das Array zweimal iteriert wird. 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, speziell speichertechnisch, da sie den Iterator nur einmal iteriert, 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 konvertieren, da es unendlich ist. Stattdessen können Sie die find()-Methode des Iterators selbst verwenden, die seq nur soweit iteriert, wie nötig, um den ersten Wert zu finden, der die Bedingung erfüllt.

Sie werden viele Iterator-Methoden finden, die analog zu Array-Methoden sind, 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.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-Helferobjekte

Hinweis: Iterator-Helferobjekte und Iterator-Hilfsmethoden sind zwei verschiedene Konzepte. Ein Iterator-Helferobjekt ist zur Laufzeit erkennbar, während "Iterator-Hilfsmethode" nur ein Name für eine Gruppe von Methoden zur Verständnisbildung 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 auch eine Instanz von Iterator, wodurch diese Hilfsmethoden verkettbar sind. Alle Iterator-Helferobjekte erben von einem gemeinsamen Prototypenobjekt, 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, so dass das Iterieren des Iterator-Helfers auch den zugrunde liegenden Iterator iterieren lässt. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrmals 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

Richtige Iteratoren

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

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

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

Konstruktor

Iterator()

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

Statische Methoden

Iterator.concat()

Erzeugt ein neues Iterator-Objekt aus einer Liste von iterierbaren Objekten. Der neue Iterator liefert die Werte aus jedem der Eingabearrays der Reihe nach.

Iterator.from()

Erstellt ein neues Iterator-Objekt aus einem Iterator oder einem 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 enthalten, mit Schlüsseln, die durch die Eingabe spezifiziert sind.

Instanz-Eigenschaften

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

Instanz-Methoden

Iterator.prototype.drop()

Gibt ein neues Iterator-Helferobjekt 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 nicht die bereitgestellte Testfunktion erfüllt. Andernfalls, wenn der Iterator ohne ein solches Element erschöpft wird, gibt er true zurück.

Iterator.prototype.filter()

Gibt ein neues Iterator-Helferobjekt zurück, das nur diejenigen Elemente des Iterators hervorbringt, für die die bereitgestellte Callback-Funktion true zurückgibt.

Iterator.prototype.find()

Gibt das erste Element zurück, das von dem Iterator erzeugt wird und 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 führt, und Elemente zurückgibt, die von der Mapping-Funktion zurückgegeben werden (die in einem anderen Iterator oder Iterable enthalten sind).

Iterator.prototype.forEach()

Führt eine bereitgestellte Funktion einmal für jedes Element aus, das vom Iterator erzeugt wird.

Iterator.prototype.includes()

Gibt true zurück, wenn ein Element, das vom Iterator erzeugt wird, dem angegebenen Wert entspricht. Andernfalls, wenn der Iterator erschöpft ist, ohne ein solches Element zu finden, gibt er false zurück.

Iterator.prototype.map()

Gibt ein neues Iterator-Helferobjekt zurück, das Elemente des Iterators zurückgibt, von denen jedes durch eine Mapping-Funktion transformiert wurde.

Iterator.prototype.reduce()

Führt eine vom Benutzer angegebene "Reducer"-Callback-Funktion auf jedem Element aus, das der Iterator hervorbringt, wobei der Rückgabewert der Berechnung auf dem vorherigen Element übergeben wird. Das Endergebnis des Reducers über alle Elemente hinweg ist ein einzelner 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 er false zurück.

Iterator.prototype.take()

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

Iterator.prototype.toArray()

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

Iterator.prototype[Symbol.dispose]()

Ruft die return()-Methode von this auf, falls sie existiert. Dies implementiert das Disposable-Protokoll und erlaubt es, beim Verwenden mit using oder await using entsorgt zu werden.

Iterator.prototype[Symbol.iterator]()

Gibt das Iterator-Objekt selbst zurück. Dies ermöglicht es, dass Iterator-Objekte auch iterierbar sind.

Beispiele

Einen Iterator als ein Iterable verwenden

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

Spezifikation
ECMAScript® 2027 Language Specification
# sec-%iteratorprototype%-object

Browser-Kompatibilität

Siehe auch