JavaScript iteroinnissa olevat objektit
Iterointiobjektit ovat iteroidakseen tarkoitettuja objekteja (kuten taulukkoja).
Iterointiobjekteja voidaan käyttää tehokkaasti ja yksinkertaisesti.
Iterointiobjekteja voidaan käyttää for..of
silmukka iteroi.
for..of-silmukka
for..of
lauseita käytetään iterointiobjektien elementtien käymiseen läpi.
syntaksi
for (muuttuja of iterable) { // 要执行的代码块 }
Iterointi
Iterointi on helppo ymmärtää.
Se tarkoittaa vain, että käydään läpi sarja elementtejä.
Tässä on muutamia yksinkertaisia esimerkkejä:
- Käy läpi merkkijono
- Käy läpi taulukko
Käy läpi merkkijono
可以使用 for..of
Käy läpi merkkijonon elementit:
Esimerkki
const name = "W3Schools"; for (const x of name) { // 要执行的代码块 }
Käy läpi taulukko
可以使用 for..of
Käy läpi taulukon elementit:
Esimerkki 1
const letters = ["a","b","c"]; for (const x of letters) { // 要执行的代码块 }
Esimerkki 2
const numbers = [2,4,6,8]; for (const x of numbers) { // 要执行的代码块 }
Käy läpi Set
可以使用 for..of
Käy läpi Set:n elementit:
Esimerkki
const letters = new Set(["a","b","c"]); for (const x of letters) { // 要执行的代码块 }
注释:我们将在后续章节中详细介绍 Set 和 Map。
遍历 Map
可以使用 for..of
循环遍历 Map 的元素:
Esimerkki
const fruits = new Map([ ["apples", 500], ["bananas", 300], ["oranges", 200] }); for (const x of fruits) { // 要执行的代码块 }
JavaScript 迭代器
迭代器协议定义了如何从对象中生成一系列值。
当对象实现了 next()
方法时,它就成为迭代器。
next()
方法必须返回一包含两个属性的对象:
- value(下一个值)
- done(true 或 false)
value |
迭代器返回的值。 如果 done 为 true,则可以省略。 |
done |
如果迭代器已完成,则为 true。 如果迭代器生成了新值,则为 false。 |
注意:
从技术上讲,可迭代对象必须实现 Symbol.iterator 方法。
字符串、数组、TypedArray、Map 和 Set 都是可迭代对象,因为它们的原型对象具有 Symbol.iterator 方法。
自定义可迭代对象
下例展示了一个自定义的可迭代对象,它永远不会结束,每次调用 next()
都会返回 10, 20, 30, 40, ...:
Esimerkki
// 自定义可迭代对象 function myNumbers() { let n = 0; return { next: function() { n += 10; return { value: n, done: false }; } }; } // 创建可迭代对象 const n = myNumbers(); n.next(); // 返回 10 n.next(); // 返回 20 n.next(); // 返回 30
问题是:
自定义的可迭代对象不支持 JavaScript 的 for..of
语句。
支持 for..of 的可迭代对象
JavaScript 可迭代对象是拥有 Symbol.iterator 的对象。
Symbol.iterator 是一个返回 next()
方法的函数。
可以使用以下代码对可迭代对象进行迭代:
for (const x of iterable}) { }
Esimerkki
// Luo objekti myNumbers = {}; // Tehdään se itseään iteratiiviseksi myNumbers[Symbol.iterator] = function() { let n = 0; done = false; return { next() { n += 10; if (n == 100) { done = true; } return { value: n, done: done }; } }; }; // Nyt voidaan käyttää for..of for (const num of myNumbers) { // Mille tahansa koodi }
Symbol.iterator-metodi kutsutaan for..of
Automaattinen kutsu.
Mutta voimme myös kutsua sitä manuaalisesti:
Esimerkki
let iterator = myNumbers[Symbol.iterator](); while (true) { const result = iterator.next(); if (result.done) break; // Mille tahansa koodi }