Symbol.iterator 是 JavaScript 迭代协议的核心符号,使对象可被 for...of 等语法遍历;它必须返回符合迭代器协议的对象(含 next() 方法),返回 {value, done};数组等内置类型默认实现,普通对象需手动添加;可结合生成器函数简化实现;该属性不可枚举、不可配置,是语言识别可迭代性的唯一依据。

Symbol.iterator 是 JavaScript 中实现迭代协议(iteration protocol)的核心符号,它让一个对象能被 for...of、扩展运算符([...obj])、解构赋值等语法识别为“可迭代对象”。
它定义了对象如何被遍历
每个具有 [Symbol.iterator] 方法的对象,都必须返回一个符合迭代器协议(iterator protocol)的对象,即包含 next() 方法的对象。该方法每次调用返回形如 { value, done } 的结果对象。
- 如果没定义
Symbol.iterator,对象就不能用于for...of,会报错TypeError: xxx is not iterable - 数组、字符串、Map、Set 等内置类型已默认部署该方法,所以天然可迭代
- 普通对象(Object)默认没有,因此
for...of不能直接遍历普通对象的属性
手动添加 Symbol.iterator 实现自定义遍历逻辑
你可以为任意对象设置自己的 Symbol.iterator 方法,控制其遍历时的行为。例如,让一个类按特定顺序或条件逐个返回值:
class Countdown {
constructor(n) {
this.count = n;
}
[Symbol.iterator]() {
return {
next: () => {
if (this.count > 0) {
return { value: this.count--, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
}
<p>for (const num of new Countdown(3)) {
console.log(num); // 输出 3, 2, 1
}它与生成器函数天然契合
使用 function* 定义生成器函数,返回一个原生迭代器,非常适合作为 Symbol.iterator 的实现:
立即学习“Java免费学习笔记(深入)”;
- 简洁:无需手动管理
done和value状态 - 支持
yield暂停/恢复,适合异步或惰性计算场景 - 示例:
[Symbol.iterator]() { return this.values(); }或直接[Symbol.iterator]: function*() { yield* this.items; }
注意:Symbol.iterator 是不可枚举、不可配置的
通过 Object.getOwnPropertySymbols(obj) 可以获取,但不会出现在 for...in 或 Object.keys() 中。它的存在是语言内部机制识别可迭代性的唯一依据,不是靠命名约定,而是靠这个唯一的 symbol 值匹配。
不复杂但容易忽略。









