Symbol.iterator 是 JavaScript 中使对象可被 for...of 遍历的内置接口,需在该属性上定义返回迭代器对象的函数,迭代器必须有返回 {value, done} 的 next() 方法。
Symbol.iterator 是 JavaScript 中让一个对象“可被 for...of 遍历”的关键机制,它不是“需要”被手动写出来,而是语言内置的约定接口——只要对象有这个属性且返回一个符合规范的迭代器,就能参与 for...of、扩展运算符([...obj])、解构、Array.from() 等操作。
一个对象要支持迭代,必须在 [Symbol.iterator] 属性上提供一个函数,这个函数被调用后必须返回一个迭代器对象。这个迭代器对象必须有 next() 方法,每次调用都返回形如 { value: ..., done: true|false } 的对象。
比如,手动实现一个可遍历的计数器:
const counter = {
from: 1,
to: 3,
[Symbol.iterator]() {
let current = this.from;
return {
next() {
if (current <= this.to) {
return { value: current++, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (const num of counter) {
console.log(num); // 1, 2, 3
}
数组、字符串、Map、Set、TypedArray 等内置类型都默认实现了 [Symbol.iterator],所以它们天然支持 for...of。比如:
[1,2,3][Symbol.iterator]() 返回数组迭代器,按索引顺序产出元素"abc"[Symbol.iterator]() 返回字符串迭代器,按 Unicode 码点产出字符(不是字节)new Map([[1,'a'],[2,'b']])[Symbol.iterator]() 返回键值对迭代器(等价于 .entries())for...of 并不关心对象是不是数组或类数组;它只检查有没有 [Symbol.iterator] 方法。没有它,哪怕有 length 和数字索引(比如普通对象 {0:'a',1:'b',length:2}),也无法被 for...of 遍历——因为没告诉引擎“从哪开始、怎么往下走、什么时候停”。
你可以随时给任意对象添加这个方法来赋予迭代能力,比如让一个 DOM 节点列表像数组一样被展开:
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]; // 现在 [...document.querySelectorAll('div')] 就能用了
定义 Symbol.iterator 不会自动添加 forEach、map 这些方法,也不会让对象变成数组。它只启用“按需逐个取值”这一种行为,是轻量、明确、可组合的协议。
基本上就这些——它不是语法必需,却是让数据“活起来”、被现代遍历语法识别的桥梁。
# javascript
# java
# 为什么
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何测试您的网站全球打开速度-网站海外测速工
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
Win11怎么快速锁屏_Win11一键锁屏快捷键Win+L【基础】
Win10系统字体模糊怎么办_Windows10高级缩放设置修复
Windows Defender扫描失败怎么办_安全模块损坏修复方式
Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】
如何使用Golang reflect检查方法数量_动态分析类型方法
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】
Win11怎么清理C盘OneDrive缓存_Win11清理OneDrive缓存技巧【方法】
如何使用Golang构建基础消息队列模拟_Golang消息发送与消费实现方法
php本地部署后数据库连接报错_1045accessdenied错误解决方法详解【汇总】
c++中如何求一个数的平方根_c++ sqrt函数与牛顿迭代法
php嵌入式日志记录怎么实现_php将硬件数据写入本地日志文件【指南】
PHP cURL GET请求:正确设置请求头与身份认证的完整教程
C#如何使用Channel C#通道实现异步通信
PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】
Win11怎么设置麦克风权限_允许应用访问Win11麦克风【详解】
MAC怎么解压RAR格式文件_MAC第三方解压工具安装与压缩包管理【教程】
Windows10电脑怎么设置自动连接WiFi_Win10无线网络属性勾选
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
Win10怎么关闭自动更新错误弹窗_Win10策略屏蔽失败提示减少干扰【防护】
如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法
php下载安装后swoole扩展怎么安装_异步框架支持【汇总】
MAC怎么设置程序窗口永远最前_MAC窗口置顶插件安装与快捷设置【方法】
Python与OpenAI接口集成实战_生成式AI应用场景解析
Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】
如何使用Golang匿名函数_快速定义临时函数逻辑
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
Windows如何拦截2345弹窗广告_Windows拦截2345弹窗方法【步骤】
Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】
Bpmn 2.0的XML文件怎么画流程图
Win11怎么设置ip地址_Windows 11手动配置网络IP教程【详解】
MAC怎么在照片中添加水印_MAC自带编辑工具文字水印叠加【方法】
c# 在高并发下使用反射发射(Reflection.Emit)的性能
Linux如何挂载新硬盘_Linux磁盘分区格式化与开机自动挂载【指南】
Win11怎么格式化U盘_Win11系统U盘格式化与文件系统选择【教程】
Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁
Win11怎么开启移动热点_Windows11共享网络给手机设置教程
如何使用Golang实现文件加密_Golang crypto 文件加密示例
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
如何在 Go 中创建包含映射(map)的切片(slice)结构
php修改数据怎么批量改状态_批量更新status字段值技巧【操作】
Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】
如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧
Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】
Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
2025-12-27
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。