symbol.iterator 是 es6 引入的内置 symbol,用于定义对象的迭代行为;当对象拥有返回迭代器的 [symbol.iterator] 方法时,即符合可迭代协议,可被 for...of 等语法消费。

Symbol.iterator 是 JavaScript 中实现自定义迭代行为的核心机制,它让对象能被 for...of、扩展运算符(...)、解构赋值等原生迭代语法识别和消费。
什么是 Symbol.iterator?
它是 ES6 引入的一个内置 symbol 值,作为对象的属性键使用。当一个对象拥有该属性且其值是一个返回迭代器对象的函数时,该对象就符合可迭代协议(iterable protocol)。
浏览器和引擎在遇到迭代语法时,会自动查找对象的 [Symbol.iterator] 方法并调用它,获取迭代器来逐个取出值。
如何手动实现一个可迭代对象?
只需在对象上定义 [Symbol.iterator] 方法,返回一个符合迭代器协议的对象(即有 next() 方法,返回 { value, done } 形式的对象):
- 定义一个类或普通对象,添加
[Symbol.iterator]()方法 - 该方法必须返回一个对象,该对象有
next()方法 -
next()每次调用应返回{ value: 当前值, done: 是否结束 }
例如,让一个数字范围对象可迭代:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
[Symbol.iterator]() {
let current = this.start;
return {
next: () => {
if (current
常见内置类型为何能被 for...of 遍历?
因为它们原生实现了 [Symbol.iterator]:
- Array:按索引顺序返回元素
- String:按 UTF-16 码元(非单个 Unicode 字符)逐个返回
- Map / Set:分别按插入顺序返回键值对或值
- TypedArray:按数组索引顺序返回数值
可通过 Array.prototype[Symbol.iterator] 查看其函数体,或直接调用验证:
const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();
console.log(it.next()); // { value: 1, done: false }
注意事项与陷阱
Symbol.iterator 只影响迭代行为,不改变对象本身结构或原型链:
- 每次调用
[Symbol.iterator]应返回**新迭代器**,避免多个遍历互相干扰 - 迭代器是**一次性消耗品**:一旦
done: true,后续next()仍应返回{ value: undefined, done: true } - 若未实现或返回非函数,
for...of会抛出TypeError: is not iterable - 不能用
typeof obj[Symbol.iterator] === 'function'完全替代可迭代性判断——还需确保调用后返回合法迭代器
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










