普通对象默认不可迭代,需手动添加Symbol.iterator方法以支持for...of等语法;它是内置符号,作为迭代器方法的键,被引擎自动调用以获取含next()方法的迭代器对象。

普通对象默认不可迭代,要让它支持 for...of 或展开语法(如 [...obj]),需手动添加 Symbol.iterator 方法,返回一个符合迭代器协议的对象。
什么是 Symbol.iterator?
Symbol.iterator 是一个内置符号,用作对象的“迭代器方法”的键。当对象被用于 for...of、解构、扩展运算符等场景时,JavaScript 引擎会查找该属性,并调用它返回的迭代器对象。这个迭代器对象必须有一个 next() 方法,返回形如 { value, done } 的对象。
如何手动实现一个基础迭代器?
给对象挂载 Symbol.iterator 属性,其值是一个函数,返回一个具有 next() 方法的对象。常见做法是基于对象自身的键或值来逐个产出:
- 用
Object.keys(obj)迭代键名 - 用
Object.values(obj)迭代值 - 用
Object.entries(obj)迭代 [key, value] 对
例如,让对象按属性值迭代:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const obj = { a: 1, b: 2, c: 3 };
obj[Symbol.iterator] = function() {
const values = Object.values(this);
let index = 0;
return {
next() {
if (index < values.length) {
return { value: values[index++], done: false };
}
return { value: undefined, done: true };
}
};
};
// 现在可以这样用
for (const val of obj) {
console.log(val); // 1, 2, 3
}
支持多次遍历和状态隔离
每次调用 [Symbol.iterator]() 都应返回**新迭代器实例**,否则多次 for...of 会相互干扰。上面例子已满足:每次调用都新建 values 数组和独立的 index 变量。
若想复用逻辑,可封装成工厂函数:
function makeValueIterator(obj) {
const values = Object.values(obj);
let index = 0;
return {
next() {
return index < values.length
? { value: values[index++], done: false }
: { value: undefined, done: true };
}
};
}
obj[Symbol.iterator] = function() {
return makeValueIterator(this);
};
进阶:支持自定义迭代行为
你可以完全控制产出什么。比如只迭代数值类型的属性值,或按字母顺序遍历键名:
obj[Symbol.iterator] = function() {
const keys = Object.keys(this).filter(k => typeof this[k] === 'number').sort();
let i = 0;
return {
next() {
const key = keys[i++];
return key !== undefined
? { value: this[key], done: false }
: { value: undefined, done: true };
}
};
};
这样 for...of obj 就只会遍历数值型且排序后的属性值。

















