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, was den Iterator auch iterierbar macht. Sie bietet auch einige Hilfsmethoden für den Umgang mit Iteratoren.
Beschreibung
Folgende sind alle eingebauten JavaScript-Iteratoren:
- Der Array-Iterator, der von
Array.prototype.values(),Array.prototype.keys(),Array.prototype.entries(),Array.prototype[Symbol.iterator](),TypedArray.prototype.values(),TypedArray.prototype.keys(),TypedArray.prototype.entries(),TypedArray.prototype[Symbol.iterator]()undarguments[Symbol.iterator]()zurückgegeben wird. - Der String-Iterator, der von
String.prototype[Symbol.iterator]()zurückgegeben wird. - Der Map-Iterator, der von
Map.prototype.values(),Map.prototype.keys(),Map.prototype.entries()undMap.prototype[Symbol.iterator]()zurückgegeben wird. - Der Set-Iterator, der von
Set.prototype.values(),Set.prototype.keys(),Set.prototype.entries()undSet.prototype[Symbol.iterator]()zurückgegeben wird. - Der RegExp String-Iterator, der von
RegExp.prototype[Symbol.matchAll]()undString.prototype.matchAll()zurückgegeben wird. - Das
Generator-Objekt, das von Generatorfunktionen zurückgegeben wird. - Der Segments-Iterator, der von der
[Symbol.iterator]()-Methode desSegments-Objekts zurückgegeben wird, das vonIntl.Segmenter.prototype.segment()zurückgegeben wird. - Der Iterator Helper, der von Iterator-Hilfsmethoden wie
Iterator.prototype.filter()undIterator.prototype.map()zurückgegeben wird.
Auch Web-APIs können Iteratoren zurückgeben. Einige verwenden Kern-JavaScript-Iteratoren, während andere ihre eigenen Iteratoren definieren. Beispielsweise:
- Array-ähnliche Objekte wie
NodeListgeben einen Array-Iterator von ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück. - Map-ähnliche Objekte von Web-APIs wie
Headersgeben ihren eigenen Iteratortyp wie Headers Iterator von ihren jeweiligen Methodenkeys(),values(),entries()und[Symbol.iterator]()zurück. - Set-ähnliche Objekte von Web-APIs wie
FontFaceSetgeben ihren eigenen Iteratortyp wie FontFaceSet Iterator von ihren jeweiligen Methodenkeys(),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 eigenes Prototyp-Objekt, das die next()-Methode implementiert, 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 anhand von 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 andere Iterator-Prototypen auch ihre eigenen [Symbol.toStringTag]-Werte, die denselben Namen haben wie die oben genannten.
Alle diese Prototyp-Objekte erben von Iterator.prototype, die 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 Anforderung, dass ein Objekt iterierbar ist, das Vorhandensein einer [Symbol.iterator]()-Methode ist. Es gibt kein gemeinsames Prototype, um diese Methoden zu installieren.
Die Iterator-Klasse bietet einige Hilfsmethoden für den Umgang mit Iteratoren. Zum Beispiel könnten Sie versucht sein, Folgendes zu tun:
const nameToDeposit = new Map([
["Anne", 1000],
["Bert", 1500],
["Carl", 2000],
]);
const totalDeposit = [...nameToDeposit.values()].reduce((a, b) => a + b);
Dies konvertiert zunächst den von Map.prototype.values() zurückgegebenen Iterator in ein Array und verwendet dann die Array.prototype.reduce()-Methode, um die Summe zu berechnen. Dies erstellt jedoch sowohl ein Zwischen-Array als auch iteriert das Array zweimal. Stattdessen können Sie die reduce()-Methode des Iterators selbst verwenden:
const totalDeposit = nameToDeposit.values().reduce((a, b) => a + b);
Diese Methode kann effizienter sein, besonders speicherseitig, da sie den Iterator nur einmal durchläuft, ohne Zwischenwerte zu speichern. Iterator-Hilfsmethoden sind notwendig, um mit unendlichen Iteratoren zu arbeiten:
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 iteriert, wie es nötig ist, um den ersten Wert zu finden, der die Bedingung erfüllt.
Sie finden viele Iterator-Methoden analog zu Array-Methoden, wie:
Iterator.prototype.drop() und Iterator.prototype.take() zusammen sind in gewissem Maße 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 eine Gruppe von Methoden zum Verständnis ist. Iterator Helper 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 Help Objekt zurück. Der Iterator Helper ist auch eine Iterator-Instanz, was diese Hilfsmethoden verkettbar macht. 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 Helper teilt dieselbe Datenquelle wie der zugrunde liegende Iterator, daher führt das Iterieren des Iterator Helpers auch zur Iteration des zugrunde liegenden Iterators. Es gibt keine Möglichkeit, einen Iterator zu "verzweigen", um ihn mehrmals iterieren zu können.
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 im Minimum nur das Vorhandensein einer next()-Methode erfordert), und Objekte, die von der Iterator-Klasse erben, die die Hilfsmethoden genießen. Diese implizieren sich nicht gegenseitig — 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 Iterator erweitert, oder verwenden Sie die Iterator.from()-Methode.
class MyIterator extends Iterator {
next() {
// …
}
}
const myIterator = Iterator.from({
next() {
// …
},
});
Konstruktor
Iterator()-
Soll von anderen Klassen, die Iteratoren erstellen, erweitert werden. Wirft einen Fehler, wenn es selbst konstruiert wird.
Statische Methoden
Iterator.concat()-
Erstellt ein neues
Iterator-Objekt aus einer Liste von iterierbaren Objekten. Der neue Iterator liefert die Werte aus jedem der Eingabewerte nacheinander. 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 durch das Übergeben von Arrays, die Elemente an der gleichen Position enthalten, aggregiert. Iterator.zipKeyed()-
Erstellt ein neues
Iterator-Objekt, das Elemente aus mehreren iterierbaren Objekten durch das Übergeben von Objekten, die Elemente an der gleichen Position enthalten, aggregiert, 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 anfängliche Wert derIterator-Konstruktor. Iterator.prototype[Symbol.toStringTag]-
Der Anfangswert der
[Symbol.toStringTag]-Eigenschaft ist der String"Iterator". Diese Eigenschaft wird inObject.prototype.toString()verwendet.Hinweis: Anders als der
[Symbol.toStringTag]bei den meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag]beschreibbar aus Gründen der Web-Kompatibilität.
Instanz-Methoden
Iterator.prototype.chunks()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das die Elemente des ursprünglichen Iterators in aufeinanderfolgende Array-Teile aufteilt. Jedes Mal, wenn der Helper durchlaufen 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-Hilfsobjekt zurück, das die gegebene Anzahl von Elementen am Anfang dieses Iterators überspringt.
Iterator.prototype.every()-
Gibt
falsezurü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 ertruezurück. Iterator.prototype.filter()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das nur diejenigen Elemente des Iterators liefert, für die die bereitgestellte Rückruffunktion
truezurückgibt. Iterator.prototype.find()-
Gibt das erste Element zurück, das vom Iterator produziert wird und die bereitgestellte Testfunktion erfüllt. Wenn keine Werte die Testfunktion erfüllen, wird
undefinedzurückgegeben. Iterator.prototype.flatMap()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das jedes Element im ursprünglichen Iterator nimmt, es durch eine Abbildungsfunktion ausführt und Elemente liefert, die von der Abbildungsfunktion zurückgegeben werden (die in einem anderen Iterator oder einer anderen Iteration enthalten sind).
Iterator.prototype.forEach()-
Führt eine bereitgestellte Funktion einmal für jedes Element aus, das vom Iterator produziert wird.
Iterator.prototype.includes()-
Gibt
truezurück, wenn ein vom Iterator produziertes Element dem gegebenen Wert entspricht. Andernfalls gibt es, wenn der Iterator erschöpft ist, ohne ein solches Element zu finden,falsezurück. Iterator.prototype.join()-
Gibt einen String zurück, der die Verkettung aller Elemente darstellt, die durch den Iterator produziert werden, getrennt durch Kommata oder einen angegebenen Trennzeichen-String.
Iterator.prototype.map()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das Elemente des Iterators liefert, wobei jedes durch eine Abbildungsfunktion transformiert wird.
Iterator.prototype.reduce()-
Führt eine vom Benutzer bereitgestellte "Reducing"-Rückruffunktion auf jedem vom Iterator produzierten Element aus und übergibt den Rückgabewert aus der Berechnung am vorherigen Element. Das Endergebnis des Ausführens des Reducers über alle Elemente hinweg ist ein einziger Wert.
Iterator.prototype.some()-
Gibt
truezurück, wenn es ein Element findet, das die bereitgestellte Testfunktion erfüllt. Andernfalls gibt es, wenn der Iterator erschöpft ist, ohne ein solches Element zu finden,falsezurück. Iterator.prototype.take()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das die gegebene Anzahl von Elementen in diesem Iterator liefert und dann endet.
Iterator.prototype.toArray()-
Erstellt eine neue
Array-Instanz, die mit den Elementen gefüllt ist, die vom Iterator geliefert werden. Iterator.prototype.windows()-
Gibt ein neues Iterator-Hilfsobjekt zurück, das ein gleitendes Fenster von Elementen liefert. Jedes Mal, wenn der Helper durchlaufen wird, liefert er ein Array, das das erste Element der vorherigen Iteration entfernt und das nächste Element des ursprünglichen Iterators hinzufügt.
Iterator.prototype[Symbol.dispose]()-
Ruft die
return()-Methode vonthisauf, wenn sie existiert. Dies implementiert das disposable protocol und erlaubt, dass es entsorgt wird, wenn es mitusingoderawait usingverwendet wird. 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 iterierbar verwenden
Alle eingebauten Iteratoren sind auch iterierbar, daher können Sie sie in einer for...of-Schleife verwenden:
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> |