迭代器是JavaScript中按需逐个获取序列值的统一遍历机制,可迭代对象则需实现[Symbol.iterator]方法;迭代器必须有返回{value, done}对象的next()方法,可迭代对象须通过该方法返回合法迭代器,生成器函数可简化实现。

迭代器是 JavaScript 中一种统一的遍历机制,它允许你按需逐个获取一个序列中的值;而可迭代对象则是实现了 [Symbol.iterator] 方法的对象,能被 for...of、展开运算符(...)、解构等语法消费。
迭代器的核心:Iterator 接口
一个迭代器是一个对象,必须有 next() 方法,该方法返回形如 { value, done } 的对象:
- 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]
只要对象拥有一个名为 Symbol.iterator 的方法,且该方法返回一个符合迭代器协议的对象,它就是可迭代的。
立即学习“Java免费学习笔记(深入)”;
例如,让一个自定义类支持 for...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()时计算,适合处理大数据或无限序列











