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统一消费。