Objeto Iterável do JavaScript
Objetos iteráveis são objetos que podem ser iterados (como arrays).
Objetos iteráveis podem ser acessados por código simples e eficiente.
Objetos iteráveis podem ser usados for..of
O loop realiza iterações.
循环...of 循环
for..of
instruções são usadas para iterar sobre os elementos de objetos iteráveis.
Sintaxe
for (variable de iterável) { // 要执行的代码块 }
Iteração
A iteração é fácil de entender.
Isso apenas significa iterar sobre uma série de elementos.
A seguir estão alguns exemplos simples:
- Iterar sobre a string
- Iterar sobre o array
Iterar sobre a string
可以使用 for..of
Iterar sobre os elementos da string:
Exemplo
const name = "W3Schools"; for (const x of name) { // 要执行的代码块 }
Iterar sobre o array
可以使用 for..of
Iterar sobre os elementos do array:
Exemplo 1
const letters = ["a","b","c"]; for (const x of letters) { // 要执行的代码块 }
Exemplo 2
const numbers = [2,4,6,8]; for (const x of numbers) { // 要执行的代码块 }
Iterar sobre o Set
可以使用 for..of
Iterar sobre os elementos do Set:
Exemplo
const letters = new Set(["a","b","c"]); for (const x of letters) { // 要执行的代码块 }
注释:我们将在后续章节中详细介绍 Set 和 Map。
遍历 Map
可以使用 for..of
循环遍历 Map 的元素:
Exemplo
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, ...:
Exemplo
// 自定义可迭代对象 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 de iterável}) { }
Exemplo
// Criar um objeto myNumbers = {}; // Fazê-lo iterável myNumbers[Symbol.iterator] = function() { let n = 0; done = false; return { next() { n += 10; if (n == 100) { done = true; } return { value: n, done: done }; } }; }; // Agora podemos usar for..of for (const num of myNumbers) { // Código arbitrário }
O método Symbol.iterator será for..of
Chamada Automática
Mas também podemos chamá-lo manualmente:
Exemplo
let iterator = myNumbers[Symbol.iterator](); while (true) { const result = iterator.next(); if (result.done) break; // Código arbitrário }