迭代器是JavaScript中按需逐个获取序列值的统一遍历机制,可迭代对象则需实现[Symbol.iterator]方法;迭代器必须有返回{value, done}对象的next()方法,可迭代对象须通过该方法返回合法迭代器,生成器函数可简化实现。
迭代器是 JavaScript 中一种统一的遍历机制,它允许你按需逐个获取一个序列中的值;而可迭代对象则是实现了 [Symbol.iterator] 方法的对象,能被 for...of、展开运算符(...)、解构等语法消费。
一个迭代器是一个对象,必须有 next() 方法,该方法返回形如 { value, done } 的对象:
true 表示迭代结束,false 表示还有值可取例如手动创建一个简单迭代器:
const createCounter = (start = 0) => {
let current = start;
return {
next() {
return { value: current++, done: false };
}
};
};
const it = createCounter(1);
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
// ⚠️ 注意:这个例子不会自动停止,实际中需加终止条件
只要对象拥有一个名为 Symbol.iterator 的方法,且该方法返回一个符合迭代器协议的对象,它就是可迭代的。
例如,让一个自定义类支持 fo:
r...of
class Countdown {
constructor(n) {
this.n = n;
}
[Symbol.iterator]() {
let i = this.n;
return {
next() {
if (i > 0) {
return { value: i--, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
}
for (const num of new Countdown(3)) {
console.log(num); // 3, 2, 1
}
生成器函数(function*)天然返回迭代器,大幅简化逻辑:
class Countdown {
constructor(n) {
this.n = n;
}
*[Symbol.iterator]() {
for (let i = this.n; i > 0; i--) {
yield i;
}
}
}
console.log([...new Countdown(3)]); // [3, 2, 1]
生成器内部自动维护状态,yield 暂停执行并产出值,下次调用 next() 继续运行,无需手动管理 done 和 value。
原生可迭代对象包括:Array、String、Map、Set、TypedArray 等。但 Object 默认不可迭代 —— 它没有 [Symbol.iterator] 方法。
typeof obj[Symbol.iterator] === 'function'
[Symbol.iterator] 应返回**新迭代器**,避免多次遍历相互影响next() 时计算,适合处理大数据或无限序列