Heim Web-Frontend js-Tutorial Einführung in die Prinzipien von Iteratoren und iterierbaren Objekten in ES6 (mit Beispielen)

Einführung in die Prinzipien von Iteratoren und iterierbaren Objekten in ES6 (mit Beispielen)

Oct 29, 2018 pm 03:34 PM
es6 iterator javascript node.js 生成器 迭代器

Dieser Artikel bietet Ihnen eine Einführung in die Prinzipien von Iteratoren und iterierbaren Objekten in ES6 (mit Beispielen). Ich hoffe, dass er Ihnen weiterhilft.

Die neuen Array-Methoden, Sammlungen, for-of-Schleifen, Spread-Operatoren (...) und sogar die asynchrone Programmierung von ES6 basieren alle auf der Implementierung eines Iterators (Iterator). In diesem Artikel werden die Iteratoren und Generatoren von ES6 ausführlich erläutert und die internen Prinzipien und die Verwendung iterierbarer Objekte weiter untersucht

Das Prinzip von Iteratoren

Verarbeitung von Arrays in Programmiersprachen Wenn Sie eine Schleifenanweisung oder eine Sammlung verwenden, müssen Sie eine Variable initialisieren, um die Iterationsposition aufzuzeichnen. Die programmgesteuerte Verwendung von Iteratoren kann diese Datenoperation vereinfachen.

Wie entwerfe ich einen Iterator?

Der Iterator selbst ist ein Objekt. Dieses Objekt verfügt über die next()-Methode, um das Ergebnisobjekt zurückzugeben. Dieses Ergebnisobjekt verfügt über den nächsten Rückgabewert und den booleschen Abschlusswert der Iteration, der das simuliert Erstellung eines einfachen Iterators wie folgt:

Wenn
function createIterator(iterms) {
  let i = 0
  return {
    next() {
      let done = (i >= iterms.length)
      let value = !done ? iterms[i++] : undefined
      return {
        done,
        value
      }
    }
  }
}

let arrayIterator = createIterator([1, 2, 3])

console.log(arrayIterator.next()) // { done: false, value: 1 }
console.log(arrayIterator.next()) // { done: false, value: 2 }
console.log(arrayIterator.next()) // { done: false, value: 3 }
console.log(arrayIterator.next()) // { done: true, value: undefined }
Nach dem Login kopieren
über die obige Syntax verwirrt ist, können Sie sich auf Folgendes beziehen: Ausführliche Erläuterung der neuen Funktionen und destrukturierenden Zuweisung von Objekten in ES6 (Codebeispiele)

Jedes Mal, wenn next() des Iterators aufgerufen wird, wird das nächste Objekt zurückgegeben, bis der Datensatz erschöpft ist.

Die Regeln zum Schreiben von Iteratoren in ES6 sind ähnlich, aber es werden Generatorobjekte eingeführt, um das Erstellen von Iteratorobjekten zu erleichtern

2. Erstellen Sie Iteratoren

ES6 kapselt einen Generator zum Erstellen von Iteratoren. Offensichtlich ist ein Generator eine Funktion, die einen Iterator zurückgibt, der durch ein Sternchen (*) nach der Funktion dargestellt wird, und das neue interne Sonderschlüsselwort yield verwendet, um den Rückgabewert der next()-Methode des Iterators anzugeben.

Wie erstelle ich einen Iterator mit ES6-Generatoren? Ein einfaches Beispiel lautet wie folgt:

function *createIterator() {
  yield 123;
  yield 'someValue'
}

let someIterator = createIterator()

console.log(someIterator.next()) // { value: 123, done: false }
console.log(someIterator.next()) // { value: 'someValue', done: false }
console.log(someIterator.next()) // { value: undefined, done: true }
Nach dem Login kopieren

Mit dem Schlüsselwort yield können Sie jeden Wert oder Ausdruck zurückgeben und Elemente stapelweise zum Iterator hinzufügen:

// let createIterator = function *(items) { // 生成器函数表达式
function *createIterator(items) {
  for (let i = 0; i < items.length; i++) {
    yield items[i]
  }
}

let someIterator = createIterator([123, &#39;someValue&#39;])

console.log(someIterator.next()) // { value: 123, done: false }
console.log(someIterator.next()) // { value: &#39;someValue&#39;, done: false }
console.log(someIterator.next()) // { value: undefined, done: true }
Nach dem Login kopieren

Da es sich um den Generator selbst handelt Als Funktion kann sie dem Objekt hinzugefügt werden und wird wie folgt verwendet:

Eine Funktion der
let obj = {
  // createIterator: function *(items) { // ES5
  *createIterator(items) { // ES6
    for (let i = 0; i < items.length; i++) {
      yield items[i]
    }
  }
}
let someIterator = obj.createIterator([123, &#39;someValue&#39;])
Nach dem Login kopieren
-Generatorfunktion besteht darin, dass die Funktion nach der Ausführung einer Yield-Anweisung und der next()-Methode des Iterators automatisch die Ausführung stoppt wird erneut aufgerufen, um mit der Ausführung der nächsten yield-Anweisung fortzufahren.
Diese Möglichkeit, die Funktionsausführung automatisch abzubrechen, führt zu vielen erweiterten Einsatzmöglichkeiten.

3. Iterierbare Objekte

Häufig verwendete Sammlungsobjekte (Arrays, Set/Map-Sammlungen) und Strings in ES6 sind iterierbare Objekte, und diese Objekte verfügen über Standard-Iteratoren und den Symbol.iterator Eigentum.

Durch Generatoren erstellte Iteratoren sind ebenfalls iterierbare Objekte, da Generatoren der Eigenschaft Symbol.iterator standardmäßig Werte zuweisen.

3.1 Symbol.iterator

Iterierbare Objekte haben die Eigenschaft Symbol.iterator, d. h. Objekte mit der Eigenschaft Symbol.iterator haben Standarditeratoren.

Wir können Symbol.iterator verwenden, um auf den Standarditerator eines Objekts zuzugreifen, beispielsweise für ein Array:

let list = [11, 22, 33]
let iterator = list[Symbol.iterator]()
console.log(iterator.next()) // { value: 11, done: false }
Nach dem Login kopieren

Symbol.iterator ruft den Standarditerator des iterierbaren Objekts des Arrays ab und bearbeitet es. Iteriert über die Elemente im Array.

Im Gegenteil, wir können Symbol.iterator verwenden, um zu erkennen, ob das Objekt ein iterierbares Objekt ist:

function isIterator(obj) {
  return typeof obj[Symbol.iterator] === &#39;function&#39;
}

console.log(isIterator([11, 22, 33])) // true
console.log(isIterator(&#39;sometring&#39;)) // true
console.log(isIterator(new Map())) // true
console.log(isIterator(new Set())) // true
console.log(isIterator(new WeakMap())) // false
console.log(isIterator(new WeakSet())) // false
Nach dem Login kopieren

Offensichtlich sind Arrays, Set/Map-Sammlungen und Strings alle iterierbare Objekte und WeakSet /WeakMap-Sammlungen (schwache Referenzsammlungen) sind nicht iterierbar.

3.2 Iterierbare Objekte erstellen

Benutzerdefinierte Objekte sind standardmäßig nicht iterierbar.

Wie gerade erwähnt, ist der durch den Generator erstellte Iterator auch ein iterierbares Objekt. Der Generator weist der Eigenschaft Symbol.iterator standardmäßig einen Wert zu.

Wie kann man also ein benutzerdefiniertes Objekt in ein iterierbares Objekt umwandeln? Durch Hinzufügen eines Generators zur Eigenschaft Symbol.iterator:

let collection = {
  items: [11,22,33],
  *[Symbol.iterator]() {
    for (let item of this.items){
      yield item
    }
  }
}

console.log(isIterator(collection)) // true

for (let item of collection){
  console.log(item) // 11 22 33
}
Nach dem Login kopieren

Die Array-Elemente sind ein iterierbares Objekt, und das Sammlungsobjekt wird ebenfalls zu einem iterierbaren Objekt, indem der Eigenschaft Symbol.iterator ein Wert zugewiesen wird.

3.3 for-of

Beachten Sie, dass das letzte Beispiel for-of anstelle der Indexschleife verwendet, eine neue Funktion, die von ES6 für iterierbare Objekte hinzugefügt wurde.

Denken Sie über das Implementierungsprinzip der For-Of-Schleife nach.

Für iterierbare Objekte, die for-of verwenden, wird jedes Mal, wenn for-of ausgeführt wird, next() des iterierbaren Objekts aufgerufen und das Rückgabeergebnis in einer Variablen gespeichert. Die Ausführung wird bis zum fortgesetzt iterierbares Objekt Der Wert des done-Attributs ist falsch.

// 迭代一个字符串
let str = &#39;somestring&#39;

for (let item of str){
  console.log(item) // s o m e s t r i n g
}
Nach dem Login kopieren

Im Wesentlichen ruft for-of die Attributmethode Symbol.iterator der Zeichenfolge str auf, um den Iterator zu erhalten (dieser Vorgang wird von der JS-Engine abgeschlossen) und ruft dann zum Speichern mehrmals die Methode next() auf der Objektwert in der Elementvariablen.

Die Verwendung von for-of für nicht iterierbare Objekte, null oder undefiniert, meldet einen Fehler!

3.4 Spread-Operator (...)

Der ES6-Syntax-Zucker-Spread-Operator (...) bedient auch iterierbare Objekte, das heißt, er kann nur Arrays und Sammlungen „verteilen“. , Strings, benutzerdefinierte iterierbare Objekte.

Die folgende Kastanie gibt die von verschiedenen iterierbaren Objekterweiterungsoperatoren berechneten Ergebnisse aus:

let str = &#39;somestring&#39;
console.log(...str) // s o m e s t r i n g
let set = new Set([1, 2, 2, 5, 8, 8, 8, 9])
console.log(set) // Set { 1, 2, 5, 8, 9 }
console.log(...set) // 1 2 5 8 9
let map = new Map([[&#39;name&#39;, &#39;jenny&#39;], [&#39;id&#39;, 123]])
console.log(map) // Map { &#39;name&#39; => 'jenny', 'id' => 123 }
console.log(...map) // [ 'name', 'jenny' ] [ 'id', 123 ]
let num1 = [1, 2, 3], num2 = [7, 8, 9]
console.log([...num1, ...num2]) // [ 1, 2, 3, 7, 8, 9 ]
let udf
console.log(...udf) // TypeError: undefined is not iterable
Nach dem Login kopieren

Wie aus dem obigen Code ersichtlich ist, kann der Erweiterungsoperator (...) iterierbare Objekte bequem konvertieren ein Array. Wie for-of meldet der Spread-Operator (...) einen Fehler, wenn er auf nicht iterierbare Objekte, null oder undefiniert, angewendet wird!

4. Standard-Iterator

ES6 为很多内置对象提供了默认的迭代器,只有当内建的迭代器不能满足需求时才自己创建迭代器。

ES6 的 三个集合对象:Set、Map、Array 都有默认的迭代器,常用的如values()方法、entries()方法都返回一个迭代器,其值区别如下:

entries():多个键值对

values():集合的值

keys():集合的键

调用以上方法都可以得到集合的迭代器,并使用for-of循环,示例如下:

/******** Map ***********/
let map = new Map([['name', 'jenny'], ['id', 123]])

for(let item of map.entries()){
  console.log(item) // [ 'name', 'jenny' ]  [ 'id', 123 ]
}
for(let item of map.keys()){
  console.log(item) // name id
}
for (let item of map.values()) {
  console.log(item) // jenny 123
}

/******** Set ***********/
let set = new Set([1, 4, 4, 5, 5, 5, 6, 6,])

for(let item of set.entries()){
  console.log(item) // [ 1, 1 ] [ 4, 4 ] [ 5, 5 ] [ 6, 6 ]
}

/********* Array **********/
let array = [11, 22, 33]

for(let item of array.entries()){
  console.log(item) // [ 0, 11 ] [ 1, 22 ] [ 2, 33 ]
}
Nach dem Login kopieren

此外 String 和 NodeList 类型都有默认的迭代器,虽然没有提供其它的方法,但可以用for-of循环

Das obige ist der detaillierte Inhalt vonEinführung in die Prinzipien von Iteratoren und iterierbaren Objekten in ES6 (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript Dec 17, 2023 pm 02:54 PM

So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen Dec 17, 2023 pm 05:30 PM

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Dec 17, 2023 pm 05:13 PM

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Bester kostenloser KI-Animationskunstgenerator Bester kostenloser KI-Animationskunstgenerator Feb 19, 2024 pm 10:50 PM

Wenn Sie den besten kostenlosen Generator für KI-Animationskunst suchen, können Sie Ihre Suche beenden. Die Welt der Anime-Kunst fasziniert das Publikum seit Jahrzehnten mit ihren einzigartigen Charakterdesigns, faszinierenden Farben und fesselnden Handlungen. Allerdings erfordert die Erstellung von Anime-Kunst Talent, Geschick und viel Zeit. Dank der kontinuierlichen Weiterentwicklung der künstlichen Intelligenz (KI) können Sie jetzt mithilfe des besten kostenlosen KI-Animationskunstgenerators die Welt der Animationskunst erkunden, ohne sich mit komplexen Technologien befassen zu müssen. Dies eröffnet Ihnen neue Möglichkeiten, Ihrer Kreativität freien Lauf zu lassen. Was ist ein KI-Generator für Anime-Kunst? Der AI Animation Art Generator nutzt hochentwickelte Algorithmen und Techniken des maschinellen Lernens, um eine umfangreiche Datenbank mit Animationswerken zu analysieren. Durch diese Algorithmen lernt und identifiziert das System verschiedene Animationsstile

Mar 17, 2024 pm 09:21 PM

Golang ist eine schnelle und effiziente statisch kompilierte Sprache. Aufgrund ihrer prägnanten Syntax und leistungsstarken Leistung ist sie im Bereich der Softwareentwicklung sehr beliebt. In Golang ist Iterator (Iterator) ein häufig verwendetes Entwurfsmuster zum Durchlaufen von Elementen in einer Sammlung, ohne die interne Struktur der Sammlung offenzulegen. In diesem Artikel wird detailliert beschrieben, wie Iteratoren in Golang implementiert und verwendet werden, und den Lesern anhand spezifischer Codebeispiele ein besseres Verständnis vermittelt. 1. Definition des Iterators In Golang besteht der Iterator normalerweise aus einer Schnittstelle und einer Implementierung

Java Iterator vs. Iterable: Die Welt der Iteratoren und iterierbaren Objekte entmystifizieren Java Iterator vs. Iterable: Die Welt der Iteratoren und iterierbaren Objekte entmystifizieren Feb 19, 2024 pm 02:15 PM

In der Java-Programmierung sind die Schnittstellen Iterator und Iterable wichtige Werkzeuge zur Verarbeitung von Elementen in Sammlungen. Die Iterator-Schnittstelle stellt Methoden für den iterativen Zugriff auf Sammlungselemente bereit, während die Iterable-Schnittstelle die Iterierbarkeit der Sammlung definiert, sodass über Iterator auf die Elemente in der Sammlung zugegriffen werden kann. Die enge Zusammenarbeit zwischen den beiden bietet uns eine allgemeine Methode zum Durchlaufen von Sammlungselementen. Iterator-Schnittstelle Die Iterator-Schnittstelle definiert die folgenden Methoden: booleanhasNext(): Prüft, ob noch Elemente in der Sammlung vorhanden sind. Enext(): Gibt das nächste Element in der Sammlung zurück. voidremove(): Entfernen Sie das aktuelle Element. Wiederholbar

So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript Jan 05, 2024 pm 01:37 PM

Einführung in die Methode zum Abrufen des HTTP-Statuscodes in JavaScript: Bei der Front-End-Entwicklung müssen wir uns häufig mit der Interaktion mit der Back-End-Schnittstelle befassen, und der HTTP-Statuscode ist ein sehr wichtiger Teil davon. Das Verstehen und Abrufen von HTTP-Statuscodes hilft uns, die von der Schnittstelle zurückgegebenen Daten besser zu verarbeiten. In diesem Artikel wird erläutert, wie Sie mithilfe von JavaScript HTTP-Statuscodes erhalten, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist ein HTTP-Statuscode? HTTP-Statuscode bedeutet, dass der Dienst den Dienst anfordert, wenn er eine Anfrage an den Server initiiert

See all articles