<p>为自定义数据结构实现 JavaScript 迭代协议,需定义[Symbol.iterator]方法并返回符合协议的迭代器对象;推荐用生成器函数(* [Symbol.iterator]() { yield ... })简化实现,或手动构造含next()方法的迭代器对象。</p>

要为自定义数据结构实现 JavaScript 的迭代协议,核心是让对象具备 [Symbol.iterator] 方法,且该方法返回一个符合迭代器协议的对象(即拥有 next() 方法,返回 { value, done } 形式的对象)。
实现可迭代接口(Iterable Protocol)
只需在自定义类或对象上定义 [Symbol.iterator] 方法。这个方法必须返回一个迭代器对象(Iterator),而迭代器本身必须有 next() 方法。
- 用
class定义时,推荐将[Symbol.iterator]设为生成器方法(function*或简写为*),它天然返回符合协议的迭代器 - 若手动实现,需确保
next()每次调用返回{ value: ..., done: false },遍历结束后返回{ value: undefined, done: true } - 注意:不能直接返回数组或其它内置可迭代对象(如
return this.items[Symbol.iterator]();),除非你明确想复用其行为;否则应返回自己的迭代逻辑
用生成器函数简化实现
生成器(function*)是最简洁、不易出错的方式。它自动满足迭代器协议,内部用 yield 控制值的逐个产出。
- 在类中定义
[Symbol.iterator]() { return this.values(); },再单独写*values()方法 - 或者更常见的是直接把
[Symbol.iterator]写成生成器:*[Symbol.iterator]() { yield ... } - 例如:一个树节点类可按中序遍历 yield 子节点,无需手动维护游标状态
手动实现迭代器(适合复杂控制流)
当需要精细控制迭代状态(比如暂停、重置、带条件跳过)时,可手动构造迭代器对象。
立即学习“Java免费学习笔记(深入)”;
- 在
[Symbol.iterator]中返回一个对象,该对象有私有状态(如索引、指针)和next()方法 -
next()必须是无参函数,每次调用推进状态并返回结果 - 避免在
next()中抛异常来表示结束——应始终返回{ done: true };否则会破坏for...of等语法的健壮性
验证是否正确实现
写完后,用标准方式测试:
- 放进
for...of循环看能否正常遍历 - 用扩展运算符
[...myObj]或解构const [a, b] = myObj测试 - 调用
myObj[Symbol.iterator]().next()直接检查返回值结构 - 注意:如果
done: true后还继续调用next(),后续调用仍应返回{ value: undefined, done: true }


















