symbol.iterator是es6内置symbol值,作为可迭代协议入口;对象需定义无参[symbol.iterator]方法并返回含next()的迭代器对象,next()须返回{value,done},且每次调用必须返回新实例。

JavaScript 中的 Symbol.iterator 是实现自定义迭代器的核心机制,它让任意对象能被 for...of、扩展运算符([...obj])、解构赋值等原生语法识别和消费。关键不在于“加个属性”,而在于正确满足迭代器协议。
Symbol.iterator 是什么
它是 ES6 引入的一个内置 Symbol 值,用作对象的特殊方法键。当一个对象拥有 [Symbol.iterator] 方法,且该方法返回一个符合迭代器协议的对象时,这个对象就成为可迭代对象。
- 该方法必须无参调用
- 返回值必须是迭代器对象(即带
next()方法的对象) -
next()每次调用需返回形如{ value, done }的对象
手动实现迭代器的要点
手写 next() 需管理状态、边界和终止逻辑,容易出错但有助于理解底层机制。
- 每次调用
[Symbol.iterator]()必须返回**新迭代器实例**,避免多个遍历共享状态 - 一旦
done: true,后续next()仍应返回{ value: undefined, done: true } - 常见错误包括:返回非函数、
done判断不严谨、未重置内部计数器
用生成器函数简化实现
更推荐使用 function* 生成器——它自动封装为合规迭代器,逻辑清晰、状态隔离、不易出错。
- 生成器内部用
yield控制产出,引擎自动处理value和done - 每次调用生成器函数都会创建独立执行上下文,天然支持多次遍历
- 可直接
yield*委托其他可迭代对象,复用已有逻辑
哪些场景需要自定义 Symbol.iterator
不是所有对象都默认可迭代,当你希望以下结构支持原生迭代语法时,就需要它:
- 自定义范围类(如
Range(1, 5)遍历数字序列) - 链表、树、图等数据结构(按需定义遍历顺序,如深度优先或层序)
- 类数组对象(含
length但非Array实例) - 懒加载集合(每次
next()才计算下一个值,节省内存)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











