JS 可迭代对象

JavaScript 可迭代对象

可迭代对象(Iterables)是可以使用 for..of 进行迭代的对象。

从技术上讲,可迭代对象必须实现 Symbol.iterator 方法。

遍历字符串

你可以使用 for..of 循环来遍历字符串的元素:

实例

for (const x of "W3School") {  // 要执行的代码块}

亲自试一试

遍历数组

您可以使用 for..of 循环来遍历数组中的元素:

实例

for (const x of [1,2,3,4,5]) {  // 要执行的代码块}

亲自试一试

JavaScript 迭代器

迭代器协议定义了如何从一个对象中生成一系列的值。

当一个对象实现了 next() 方法时,它就成为了一个迭代器。

next() 方法必须返回一个带有两个属性的对象:

  • value(下一个值)
  • done(true 或 false)
value

迭代器返回的值

(如果 done 为 true,则可以省略)

done

如果迭代器已经完成,则返回 true

如果迭代器产生了一个新值,则返回 false

自制的可迭代对象

这个可迭代对象会无限返回:10、20、30、40...... 当每次调用 next() 时:

实例

// 自制的可迭代对象function myNumbers() {  let n = 0;  return {    next: function() {      n += 10;      return {value:n, done:false};    }  };}// 创建可迭代对象const n = myNumbers();n.next(); // Returns 10n.next(); // Returns 20n.next(); // Returns 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;  // 这里可写任何代码}

亲自试一试