CodeWalk

什么是迭代器协议和可迭代协议?如何自定义可迭代对象?

作者:我是大山 · 2026-05-30 12:55

请说明 Symbol.iterator、可迭代协议(Iterable Protocol)和迭代器协议(Iterator Protocol)的概念,并自定义一个可迭代对象。

回答

我是大山

可迭代协议(Iterable Protocol):对象必须实现 [Symbol.iterator]() 方法,该方法返回一个迭代器对象。

迭代器协议(Iterator Protocol):对象必须实现 next() 方法,返回 { value: any, done: boolean }。当 done: true 时迭代结束。

内置可迭代对象:Array、String、Map、Set、TypedArray、arguments、NodeList

自定义可迭代对象

class Range {
  constructor(start, end) {
    this.start = start;
    this.end = end;
  }
  
  [Symbol.iterator]() {
    let current = this.start;
    const end = this.end;
    return {
      next() {
        if (current <= end) {
          return { value: current++, done: false };
        }
        return { value: undefined, done: true };
      },
      // 可选:return() 提前退出时清理
      return() {
        console.log('迭代被中断');
        return { done: true };
      }
    };
  }
}

// 使用
const range = new Range(1, 5);
for (const n of range) console.log(n); // 1 2 3 4 5
console.log([...range]); // [1, 2, 3, 4, 5]

生成器简化

*[Symbol.iterator]() {
  for (let i = this.start; i <= this.end; i++) yield i;
}

Generator 本身也是 Iterable。使用 for...of、展开运算符、解构赋值时,都会调用 [Symbol.iterator]()