JavaScript Iterables
可迭代对象是可迭代对象(如数组)。
使用简单高效的代码即可访问可迭代对象。
可以使用 for..of 循环迭代可迭代对象
For Of 循环
JavaScript 的 for..of 语句循环遍历可迭代对象中的元素。
语法
for (variable of iterable) {
  // 要执行的代码块
}
迭代
迭代很容易理解。
它只是意味着遍历一系列元素。
这里有一些简单的例子
- 迭代字符串
- 迭代数组
迭代字符串
您可以使用 for..of 循环来迭代字符串中的元素
迭代数组
您可以使用 for..of 循环来迭代数组中的元素
迭代 Set
您可以使用 for..of 循环来迭代 Set 中的元素
注意
Set 和 Map 在下一章介绍。
迭代 Map
您可以使用 for..of 循环来迭代 Map 中的元素
示例
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,则可省略) | 
|---|---|
| 完成 | 如果迭代器已完成,则为 true 如果迭代器生成了新值,则为 false | 
注意
严格来说,可迭代对象必须实现 Symbol.iterator 方法。
String、Array、TypedArray、Map 和 Set 都是可迭代对象,因为它们的原型对象具有 Symbol.iterator 方法。
自制可迭代对象
这个可迭代对象返回永不结束的序列:10, 20, 30, 40,.... 每次调用 next() 时
示例
// Home Made Iterable
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 语句。
JavaScript 可迭代对象是一个具有Symbol.iterator的对象。
Symbol.iterator 是一个返回 next() 函数的函数。
可以使用代码 for (const x of iterable) { } 来迭代可迭代对象
示例
// 创建一个对象
myNumbers = {};
// 使其可迭代
myNumbers[Symbol.iterator] = function() {
  let n = 0;
  done = false;
  return {
    next() {
      n += 10;
      if (n == 100) {done = true}
      return {value:n, done:done};
    }
  };
}
现在您可以使用 for..of
for (const num of myNumbers) {
  // 任何代码
}
自己动手试一试 »
Symbol.iterator 方法由 for..of 自动调用。
但我们也可以“手动”完成
示例
let iterator = myNumbers[Symbol.iterator]();
while (true) {
  const result = iterator.next();
  if (result.done) break;
  // 任何代码
}
自己动手试一试 »
 
