贝利信息

什么是javascript中的迭代器和可迭代协议?_如何让自定义对象支持for...of循环?

日期:2025-12-26 00:00 / 作者:狼影
迭代器是具有next()方法的对象,每次调用返回{value: ..., done: true|false};可迭代协议通过[Symbol.iterator]方法使对象支持for...of遍历。

JavaScript 中的迭代器(Iterator)和可迭代协议(Iterable Protocol)是一套配合使用的机制,用来统一数据遍历的方式。简单说:可迭代协议规定“这个对象能不能被 for...of 遍历”,而迭代器定义“怎么一步步把它的值取出来”。

迭代器是什么?

迭代器是一个有 next() 方法的对象,每次调用都返回一个形如 { value: ..., done: true|false } 的对象:

例如,手动创建一个简单迭代器:

const counter = {
  [Symbol.iterator]() {
    let i = 0;
    return {
      next() {
        if (i < 3) {
          return { value: i++, done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};

可迭代协议是怎么回事?

一个对象只要拥有名为 Symbol.iterator 的方法,并且该方法返回一个符合迭代器协议的对象,它就是“可迭代的”。for...of、展开运算符(...)、Array.from() 等语法都会自动调用这个方法。

内置类型如 Array、String、Map、Set 都实现了这个协议,所以能直接用于 for...of。

让自定义对象支持 for...of

只需在对象上定义 [Symbol.iterator]() 方法,返回一个迭代器对象即可。常见写法有三种:

用生成器改写 counter 示例:

const counter = {
  [Symbol.iterator]: function* () {
    for (let i = 0; i < 3; i++) {
      yield i;
    }
  }
};
// 现在可以这样用了:
for (const n of counter) console.log(n); // 0, 1, 2

注意几个关键点

不复杂但容易忽略。