普通对象需手动实现Symbol.iterator方法才能被for...of或展开运算符遍历;该方法须返回含next()的对象,next()返回{value, done}结构,done为true时终止迭代。

普通对象默认不可迭代,要让它支持 for...of 或展开运算符([...obj]),就得手动挂载 Symbol.iterator 方法,返回一个符合迭代器协议的对象。
理解 Symbol.iterator 的基本要求
它必须是一个无参函数,返回的对象需满足迭代器协议:即有 next() 方法,该方法返回形如 { value: ..., done: true|false } 的对象。只要满足这个结构,就可以被 JavaScript 的迭代语法识别。
为普通对象添加基础迭代器
比如想让一个键值对对象按属性值依次迭代:
// 示例对象const obj = { a: 1, b: 2, c: 3 };obj[Symbol.iterator] = function* () { for (const key of Object.keys(this)) { yield this[key]; }};
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
这样就能直接用 for (const val of obj) {...} 或 [...obj] 得到 [1, 2, 3]。
手写非生成器版本(更清晰控制流程)
如果不想用 function*,也可以手动实现 next():
- 先缓存对象的键数组和当前索引
-
next()每次返回下一个值,直到遍历完 - 注意
done: true必须在最后一步准确返回
obj[Symbol.iterator] = function () { const keys = Object.keys(this); let index = 0; return { next() { if (index <br><code> return { value: this[keys[index++]], done: false }; } else { return { value: undefined, done: true }; } } };};
按需定制迭代逻辑
你可以决定迭代什么内容:只遍历值、只遍历键、遍历 [key, value] 元组,甚至跳过某些属性或按特定顺序排列:
- 遍历键名:
yield key - 遍历键值对:
yield [key, this[key]] - 过滤属性:
if (key.startsWith('_')) continue - 自定义顺序:
Object.keys(this).sort().forEach(...)
关键在于,Symbol.iterator 是你完全掌控的入口,行为由你定义,不依赖原型链或内置规则。

















