Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. Iterator

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

View in EnglishAlways 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.

EinIterator-Objekt ist ein Objekt, das demIterator-Protokoll entspricht, indem es einenext()-Methode bereitstellt, die ein Iterator-Ergebnisobjekt zurückgibt. Alle eingebauten Iteratoren erben von derIterator-Klasse. DieIterator-Klasse bietet eine[Symbol.iterator]()-Methode, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auchiterable wird. Außerdem bietet sie einige Hilfsmethoden für die Arbeit mit Iteratoren.

Beschreibung

Folgende sind alle eingebauten JavaScript-Iteratoren:

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

  • Array-ähnliche Objekte wieNodeList geben einenArray Iterator von ihren jeweiligen Methodenkeys(),values(),entries() und[Symbol.iterator]() zurück.
  • Map-ähnliche Objekte aus Web-APIs wieHeaders geben ihren eigenen Iteratortyp wieHeaders Iterator von ihren jeweiligen Methodenkeys(),values(),entries() und[Symbol.iterator]() zurück.
  • Set-ähnliche Objekte aus Web-APIs wieFontFaceSet geben ihren eigenen Iteratortyp wieFontFaceSet Iterator von ihren jeweiligen Methodenkeys(),values(),entries() und[Symbol.iterator]() zurück.

Hinweis:NodeIterator und andere alte Schnittstellen sind so benannt, entsprechen aber nicht demIterator-Protokoll oderIterable-Protokoll.

Jeder dieser Iteratoren hat ein eigenes Prototypobjekt, das dienext()-Methode definiert, die vom jeweiligen Iterator verwendet wird. Beispielsweise erben alle String-Iterator-Objekte von einem versteckten ObjektStringIteratorPrototype, das einenext()-Methode hat, die diese Zeichenkette durch Codepunkte iteriert.StringIteratorPrototype hat auch eine[Symbol.toStringTag] Eigenschaft, deren Anfangswert die Zeichenkette"String Iterator" ist. Diese Eigenschaft wird inObject.prototype.toString() verwendet. Ebenso haben andere Iterator-Prototypen auch ihre eigenen[Symbol.toStringTag]-Werte, die mit den oben genannten Namen übereinstimmen.

Alle diese Prototypobjekte erben vonIterator.prototype, das eine[Symbol.iterator]()-Methode bereitstellt, die das Iterator-Objekt selbst zurückgibt, wodurch der Iterator auchiterable wird.

Iterator-Hilfsmethoden

Hinweis:Diese Methoden sindIterator-Helfer, keineIterable-Helfer, da die einzige Voraussetzung für ein Objekt, um iterable zu sein, nur die Anwesenheit einer[Symbol.iterator]()-Methode ist. Es gibt keinen gemeinsamen Prototyp, um diese Methoden zu installieren.

DieIterator-Klasse selbst bietet einige Hilfsmethoden zum Arbeiten mit Iteratoren. Beispielsweise 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 konvertiert zuerst den vonMap.prototype.values() zurückgegebenen Iterator in ein Array und verwendet dann dieArray.prototype.reduce()-Methode, um die Summe zu berechnen. Dies erzeugt jedoch sowohl ein Zwischen-Array als auch durchläuft das Array zweimal. Stattdessen können Sie diereduce()-Methode des Iterators selbst verwenden:

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

Diese Methode ist möglicherweise effizienter, insbesondere speichermäßig, da sie den Iterator nur einmal durchläuft, ohne irgendwelche Zwischenwerte zu merken. 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önnenseq nicht in ein Array konvertieren, da es unendlich ist. Stattdessen können Sie diefind()-Methode des Iterators selbst verwenden, dieseq nur so weit durchläuft, wie nötig ist, um den ersten Wert zu finden, der die Bedingung erfüllt.

Sie werden viele Iterator-Methoden finden, die den Array-Methoden analog sind, wie zum Beispiel:

Iterator-MethodeArray-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() undIterator.prototype.take() kombiniert sind etwas analog zuArray.prototype.slice().

Iterator-Helferobjekte

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

Unter den Iterator-Hilfsmethoden gebenfilter(),flatMap(),map(),drop() undtake() ein neuesIterator-Helfer-Objekt zurück. Der Iterator-Helfer ist auch eineIterator-Instanz, was diese Hilfsmethoden kaskadierbar macht. Alle Iterator-Helferobjekte erben von einem gemeinsamen Prototypobjekt, das das Iterator-Protokoll implementiert:

next()

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

return()

Ruft diereturn()-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 Durchlaufen des Iterator-Helfers auch den zugrunde liegenden Iterator durchläuft. Es gibt keine Möglichkeit, einen Iterator zu "forken", um ihn mehrfach durchlaufbar zu machen.

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

Richtige Iteratoren

Es gibt zwei Arten von "Iteratoren": Objekte, die demIterator-Protokoll entsprechen (was im Minimum nur die Anwesenheit einernext()-Methode erfordert), und Objekte, die von derIterator-Klasse erben, die die Hilfsmethoden haben. Sie bedingen sich nicht gegenseitig – Objekte, die vonIterator erben, werden nicht automatisch zu Iteratoren, da dieIterator-Klasse keinenext()-Methode definiert. Stattdessen muss das Objekt einenext()-Methode selbst definieren. Einrichtiger Iterator ist einer, der sowohl dem Iterator-Protokoll entspricht als auch vonIterator erbt, und die meisten Code erwarten, dass Iteratoren richtige Iteratoren sind und Iterables richtige Iteratoren zurückgeben. Um richtige Iteratoren zu erstellen, definieren Sie eine Klasse, dieIterator erweitert, oder verwenden Sie dieIterator.from()-Methode.

js
class MyIterator extends Iterator {  next() {    // …  }}const myIterator = Iterator.from({  next() {    // …  },});

Konstruktor

Iterator()

Soll von anderen Klassen erweitert werden, die Iteratoren erstellen. Löst einen Fehler aus, wenn er von sich selbst konstruiert wird.

Statische Methoden

Iterator.from()

Erstellt ein neuesIterator-Objekt aus einem Iterator oder Iterable-Objekt.

Instanzeigenschaften

Diese Eigenschaften sind aufIterator.prototype definiert und werden von allenIterator-Instanzen geteilt.

Iterator.prototype.constructor

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

Iterator.prototype[Symbol.toStringTag]

Der Anfangswert der[Symbol.toStringTag]-Eigenschaft ist die Zeichenfolge"Iterator". Diese Eigenschaft wird inObject.prototype.toString() verwendet.

Hinweis:Im Gegensatz zu dem[Symbol.toStringTag] in den meisten eingebauten Klassen istIterator.prototype[Symbol.toStringTag] beschreibbar aus Gründen der Webkompatibilität.

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

Prüft, ob alle Elemente, die vom Iterator erzeugt werden, den in der bereitgestellten Funktion implementierten Test bestehen.

Iterator.prototype.filter()

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

Iterator.prototype.find()

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

Iterator.prototype.flatMap()

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

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 vom Iterator erzeugten Elemente ausgibt, wobei jedes durch eine Abbildungsfunktion transformiert wird.

Iterator.prototype.reduce()

Führt eine vom Benutzer bereitgestellte "Reducer"-Callback-Funktion für jedes vom Iterator erzeugte Element aus und übergibt den Rückgabewert der Berechnung des vorhergehenden Elements. Das endgültige Ergebnis des Reduzierens aller Elemente ist ein einzelner Wert.

Iterator.prototype.some()

Prüft, ob mindestens ein Element im Iterator den in der bereitgestellten Funktion implementierten Test besteht. Es 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 beendet.

Iterator.prototype.toArray()

Erstellt eine neueArray-Instanz, die mit den aus dem Iterator ausgegebenen Elementen gefüllt ist.

Iterator.prototype[Symbol.dispose]()

Ruft diereturn()-Methode vonthis auf, falls sie existiert. Dies implementiert dasDisposable-Protokoll und ermöglicht es, beim Gebrauch mitusing oderawait using entsorgt zu werden.

Iterator.prototype[Symbol.iterator]()

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

Beispiele

Verwenden eines Iterators als Iterable

Alle eingebauten Iteratoren sind auch iterable, sodass Sie sie in einerfor...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

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp