ES6迭代器核心是遵守可迭代协议和迭代器协议:对象需实现无参Symbol.iterator方法,每次返回新迭代器;该迭代器必须有next()方法,返回{value, done}对象;状态须隔离以支持多次遍历。

ES6 迭代器在实现自定义数据结构时,核心在于严格遵守两个协议:可迭代协议(Iterable Protocol)和迭代器协议(Iterator Protocol)。只要这两个协议落实到位,你的数据结构就能无缝接入 for...of、展开运算符(...)、Array.from() 等标准语法。
必须实现 Symbol.iterator 方法
你的自定义对象要能被遍历,首要条件是拥有一个名为 Symbol.iterator 的方法。这个方法必须:
- 不接收任何参数(无参函数)
- 每次调用都返回一个**新的迭代器对象**(不能复用旧状态)
- 该返回对象需满足迭代器协议(见下一条)
例如:
class Countdown {
constructor(n) {
this.n = n;
}
[Symbol.iterator]() {
let i = this.n;
return {
next() {
if (i > 0) return { value: i--, done: false };
return { value: undefined, done: true };
}
};
}
}
迭代器对象必须提供 next() 方法
由 Symbol.iterator 返回的对象,就是真正的迭代器。它必须具备 next() 方法,且该方法返回值必须是固定结构的对象:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
value:当前产出的值(类型由你定义,如 number、string 或任意类型) -
done:布尔值,false表示还有值可取,true表示遍历结束 - 当
done为true时,value可省略或显式设为undefined
避免共享内部状态,确保多次遍历互不影响
同一个可迭代对象可以被多次遍历(比如两次 for...of),因此每次调用 [Symbol.iterator]() 都应创建独立的状态环境。常见错误是把索引或计数器定义在类实例上,导致第二次遍历时从上次中断处继续。
正确做法是把状态(如 let i = ...)放在 [Symbol.iterator] 函数内部或其返回的闭包中。
可选但推荐:支持 return() 和 throw()
虽然不是强制要求,但若希望迭代器能响应提前终止(如 break、return 在循环中,或生成器委托中),可添加 return() 方法;若需配合错误注入机制,还可实现 throw()。它们也应返回符合 { value, done } 结构的对象。

















