可直接在对象字面量中用计算属性名[symbol.iterator]()定义迭代器,需为生成器函数或返回符合迭代器协议的对象,支持for...of和展开运算符等。

可以直接在对象字面量中用计算属性名(computed property name)引用 Symbol.iterator,让对象具备可迭代能力,无需额外赋值或后置定义。
语法结构要正确
计算属性名必须用方括号包裹表达式,且该表达式需求值为一个有效键(如 Symbol)。Symbol.iterator 是内置 Symbol,专门用于定义对象的默认迭代器。
- 写法:`[Symbol.iterator]()`,不是 `Symbol.iterator()` 或 `"Symbol.iterator"`
- 必须是方法(函数),返回一个符合迭代器协议的对象(含
next()方法) - 不能写成箭头函数(因需绑定
this上下文)
实现一个基础可迭代对象
以下是一个完整示例,对象内部维护一个数组,通过计算属性名暴露 Symbol.iterator 接口:
const iterableObj = {
data: [1, 2, 3],
*[Symbol.iterator]() {
yield* this.data;
}
};
<p>// 现在可以正常使用 for...of、展开运算符等
for (const item of iterableObj) {
console.log(item); // 1, 2, 3
}
console.log([...iterableObj]); // [1, 2, 3]
</p>
注意:这里用了生成器函数(*),它自动返回符合迭代器协议的对象,是最简洁可靠的实现方式。
避免常见错误
容易出错的地方包括:
- 忘记方括号:`Symbol.iterator() {}` 是非法语法,会报错
- 返回值不符合协议:若手动返回对象,必须带
next()方法并返回{ value, done }形式 - 作用域问题:在对象字面量中,
this指向当前对象,但若用普通函数且未绑定,可能丢失上下文(生成器函数天然支持this)
兼容性与实际用途
Symbol.iterator 是 ES6 标准特性,现代浏览器和 Node.js(≥ v0.12)均支持。实际中常用于:
- 自定义集合类(如 Stack、Queue)支持原生迭代
- 封装数据源(如分页结果、流式响应)使其能被
for...of消费 - 配合扩展运算符、
Array.from()、解构等语法提升 API 友好度
不复杂但容易忽略细节,关键是把 Symbol 当作动态键来用,而不是字符串或普通标识符。











