要让自定义对象支持 for...of 循环,必须在对象上定义 [symbol.iterator] 方法,返回一个具有 next() 方法的迭代器对象,推荐使用生成器函数实现;该对象还可用于扩展运算符、解构赋值、array.from() 等。

让自定义对象支持 for...of 循环,关键是在对象上定义 [Symbol.iterator] 方法,并让它返回一个符合迭代器协议的对象——即该对象必须有 next() 方法,每次调用返回形如 { value, done } 的对象。
必须实现 Symbol.iterator 方法
普通对象默认没有 [Symbol.iterator],所以直接用于 for...of 会报错。你需要手动添加这个方法,它必须是函数类型,且无参数:
- 方法名必须严格写成
[Symbol.iterator](方括号表示计算属性名) - 不能写成字符串
"Symbol.iterator"或其他变体 - 该方法会在
for...of启动时被自动调用一次
返回的迭代器对象要带 next() 方法
[Symbol.iterator] 的返回值是一个“迭代器对象”,它至少要有一个 next() 函数。这个函数控制每次循环取哪个值:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
next()第一次调用应返回第一个元素,done: false - 后续调用依次返回后续元素,直到数据耗尽
- 当遍历结束,
next()必须返回{ done: true }(value可省略或设为undefined) - 之后再调用
next(),仍应返回{ value: undefined, done: true }
推荐用生成器函数实现(最简洁)
手写 next() 容易出错(比如状态管理混乱、this 绑定问题)。更可靠的方式是用生成器函数(function*):
- 生成器函数本身返回的就是标准迭代器,天然满足协议
- 内部用
yield表达式逐个产出值,逻辑清晰 - 示例:
obj[Symbol.iterator] = function*() { yield 1; yield 2; yield 3; };
支持哪些语法不只是 for-of
只要实现了 [Symbol.iterator],对象就变成“可迭代对象”,不仅能用于 for...of,还能用于:
- 扩展运算符:
[...obj] - 数组解构:
const [a, b] = obj; Array.from(obj)-
new Set(obj)、new Map(iterable)等构造函数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










