跳到主要内容

Iterator 是什么,有什么作用?

面试速答(30 秒版 TL;DR)

  • Iterator 是一种“迭代器协议”:对象提供 next() 方法,每次返回 { value, done }
  • 如果一个对象实现了 obj[Symbol.iterator]() 并返回 iterator,它就是“可迭代(iterable)”,可以被 for...of...Array.from 等消费。
  • 作用:把“遍历”标准化,让自定义数据结构也能像数组一样被统一遍历。

两个协议:iterable 与 iterator

  • iterable:有 [Symbol.iterator]() 方法,返回 iterator。
  • iterator:有 next() 方法,返回 {value, done}

最小例子:实现一个可迭代的 range

const range = (start, end) => ({
[Symbol.iterator]() {
let cur = start;
return {
next() {
if (cur > end) return {done: true, value: undefined};
return {done: false, value: cur++};
},
};
},
});

console.log([...range(3, 5)]); // [3, 4, 5]
for (const x of range(1, 3)) console.log(x); // 1 2 3

常见追问

  • 为什么 for...of 能遍历数组/Map/Set?
    • 它们都实现了 Symbol.iterator,返回标准 iterator。
  • iterator 还有哪些能力?
    • 一些实现会支持 return() 用于提前终止时清理资源(例如生成器)。

易错点/坑

  • for...in 遍历的是 key(属性名),for...of 遍历的是值(通过 iterator 协议)。
  • “有 next 就能 for...of”不准确:for...of 需要 iterable(即有 Symbol.iterator)。

速记要点(可背诵)

  • Iterator:next() -> {value, done}
  • Iterable:实现 [Symbol.iterator](),可被 for...of / ... / Array.from 统一消费。