Symbol.iterator在迭代协议中的作用是定义对象的默认迭代器,使对象可以被for...of循环等迭代结构使用。
2026-04-04 15:48:23
0浏览
收藏
Symbol.iterator 是 JavaScript 迭代协议的基石,它以不可枚举、不可配置的唯一符号身份,精准定义对象如何被 for...of、扩展运算符、解构赋值等现代语法识别和遍历;内置类型如数组、字符串已原生支持,而普通对象可通过手动实现或更简洁的生成器函数(function*)赋予自定义迭代行为——掌握它,你就能让任意数据结构优雅融入 JavaScript 的迭代生态,解锁惰性计算、条件遍历与语义化遍历的无限可能。

Symbol.iterator 是 JavaScript 中实现迭代协议(iteration protocol)的核心符号,它让一个对象能被 for...of、扩展运算符([...obj])、解构赋值等语法识别为“可迭代对象”。
它定义了对象如何被遍历
每个具有 [Symbol.iterator] 方法的对象,都必须返回一个符合迭代器协议(iterator protocol)的对象,即包含 next() 方法的对象。该方法每次调用返回形如 { value, done } 的结果对象。
- 如果没定义
Symbol.iterator,对象就不能用于for...of,会报错TypeError: xxx is not iterable - 数组、字符串、Map、Set 等内置类型已默认部署该方法,所以天然可迭代
- 普通对象(Object)默认没有,因此
for...of不能直接遍历普通对象的属性
手动添加 Symbol.iterator 实现自定义遍历逻辑
你可以为任意对象设置自己的 Symbol.iterator 方法,控制其遍历时的行为。例如,让一个类按特定顺序或条件逐个返回值:
class Countdown {
constructor(n) {
this.count = n;
}
[Symbol.iterator]() {
return {
next: () => {
if (this.count > 0) {
return { value: this.count--, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
}
<p>for (const num of new Countdown(3)) {
console.log(num); // 输出 3, 2, 1
}</p>它与生成器函数天然契合
使用 function* 定义生成器函数,返回一个原生迭代器,非常适合作为 Symbol.iterator 的实现:
- 简洁:无需手动管理
done和value状态 - 支持
yield暂停/恢复,适合异步或惰性计算场景 - 示例:
[Symbol.iterator]() { return this.values(); }或直接[Symbol.iterator]: function*() { yield* this.items; }
注意:Symbol.iterator 是不可枚举、不可配置的
通过 Object.getOwnPropertySymbols(obj) 可以获取,但不会出现在 for...in 或 Object.keys() 中。它的存在是语言内部机制识别可迭代性的唯一依据,不是靠命名约定,而是靠这个唯一的 symbol 值匹配。
不复杂但容易忽略。
好了,本文到此结束,带大家了解了《Symbol.iterator在迭代协议中的作用是定义对象的默认迭代器,使对象可以被for...of循环等迭代结构使用。》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!
粤语翻译工具实时更新 粤语翻译官网地址
- 上一篇
- 粤语翻译工具实时更新 粤语翻译官网地址
- 下一篇
- Golang channel死锁怎么避免?缓冲与非缓冲用法解析
查看更多
最新文章
-
- 文章 · 前端 | 3分钟前 |
- CSS实现苹果官网视差滚动效果
- 484浏览 收藏
-
- 文章 · 前端 | 6分钟前 |
- CSS设置Bootstrap字体样式,通过变量统一管理排版
- 278浏览 收藏
-
- 文章 · 前端 | 6分钟前 |
- CSS创建动态网格布局:grid与media query实战教程
- 124浏览 收藏
-
- 文章 · 前端 | 9分钟前 |
- CSS基线对齐文本布局技巧
- 219浏览 收藏
-
- 文章 · 前端 | 11分钟前 |
- HTML5表单错位怎么解决?控件对齐技巧
- 464浏览 收藏
-
- 文章 · 前端 | 14分钟前 |
- 多级垂直菜单设计与递归样式实现
- 131浏览 收藏
-
- 文章 · 前端 | 21分钟前 |
- Set高效处理数组并集交集差集方法
- 443浏览 收藏
-
- 文章 · 前端 | 30分钟前 | HTML标签 HTML标签用法
- 微信浏览器HTML适配meta标签详解
- 100浏览 收藏
