新闻中心
J*aScript迭代协议详解_j*ascript遍历机制
可迭代协议要求对象实现Symbol.iterator方法,返回遵循迭代器协议的迭代器;2. 迭代器协议要求对象具有next()方法,返回包含value和done属性的对象;3. 二者共同支持for...of、扩展运算符等语法,使数组、字符串及自定义对象可被遍历。

J*aScript
中的遍历机制建立在两个核心协议之上:可迭代协议(Iterable Protocol)和迭代器协议(Iterator Protocol)。这两个协议共同支撑了语言中 for...of 循环、扩展运算符、解构赋值等语法的实现。理解它们有助于深入掌握 J*aScript 的数据遍历逻辑。
可迭代协议(Iterable Protocol)
一个对象如果实现了 Symbol.iterator 方法,就被认为是可迭代的。这个方法必须返回一个迭代器对象,即遵循迭代器协议的对象。当使用 for...of 遍历数组、字符串、Map 等原生类型时,J*aScript 引擎会自动调用该对象的 Symbol.iterator 方法获取迭代器。
例如,数组是原生可迭代对象:
const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
iterator.next(); // { value: 1, done: false }
iterator.next(); // { value: 2, done: false }
任何自定义对象只要实现 Symbol.iterator 方法,也可以被 for...of 使用:
const myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
};
<p>for (const value of myIterable) {
console.log(value); // 输出 1, 2, 3
}</p>迭代器协议(Iterator Protocol)
迭代器是一个具有 next() 方法的对象,该方法返回一个包含 value 和 done 属性的结果对象。
- value:当前迭代的值,可以是任意类型。
- done:布尔值,表示迭代是否完成。为 true 时表示遍历结束。
迭代器本身也通常是可迭代的,只需在返回的对象上实现 [Symbol.iterator]() => this,这样它就能被 for...of 正常处理。
const counter = {
current: 0,
end: 3,
next() {
if (this.current < this.end) {
return { value: ++this.current, done: false };
} else {
return { done: true };
}
},
[Symbol.iterator]() {
return this;
}
};
<p>for (const num of counter) {
console.log(num); // 输出 1, 2, 3
}</p>原生支持可迭代的对象
以下内置类型默认实现了 Symbol.iterator,可以直接用于 for...of 或扩展运算符:
- Array
- String
- TypedArray(如 Uint8Array)
- Map
- Set
- arguments 对象
- DOM 集合(如 NodeList)部分支持
例如:
const str = "hi";
[...str]; // ['h', 'i']
<p>const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map) {
console.log(key, value); // a 1, b 2
}</p>生成器函数与迭代器
生成器函数(function*)是创建迭代器最简便的方式。它会自动返回一个符合迭代器协议的对象,无需手动实现 next() 和 done 逻辑。
function* idGenerator() {
let id = 1;
while (true) {
yield id++;
}
}
<p>const gen = idGenerator();
gen.next().value; // 1
gen.next().value; // 2</p>生成器函数中的 yield 暂停执行并返回值,下次调用 next() 时从暂停处继续,非常适合实现惰性求值和无限序列。
基本上就这些。理解可迭代与迭代器协议,能让你更清楚 for...of 背后发生了什么,也能写出更灵活的数据结构。不复杂但容易忽略细节。
以上就是J*aScript迭代协议详解_j*ascript遍历机制的详细内容,更多请关注其它相关文章!
# 文件上传
# 网站网络推广行业
# 文旦SEO
# seo提高
# 太原百度关键词排名软件
# 大连长海网站推广
# 新网站建设怎么建设才好
# 浙江网站营销推广招聘网
# 嘉定营销推广平台有哪些
# 一戈seo24乌鲁木齐网站推广v1
# 平山自制网站建设招标公告
# 是一个
# javascript
# 如何实现
# 键值
# 如何使用
# 自定义
# 数据结构
# 运算符
# 遍历
# 迭代
# 可迭代对象
# node
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
必由学官网快捷入口 必由学网页版在线学习平台
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道
解决Django多数据库/多Schema环境下外键迁移问题
CSS布局中意外空白:解决padding-top导致的顶部间距问题
微信网页版官方快速登录入口 微信网页版网页版账号直达
Excel Power Pivot如何处理XML数据源 构建高级数据模型
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
AO3网页版合集入口 Archive of Our Own同人作品浏览指南
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
快手网页版在线登录 快手网页版官网入口快速访问
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
mc.js游戏直达 mc.js网页免下载版本秒进地址
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
Golang如何优雅处理error_Golang error处理最佳实践总结
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
Tabulator表格中精确实现日期时间排序的指南
知音漫客正版漫画平台_知音漫客官网账号登录
163邮箱官方主页登录 直达网易邮箱登录核心页面
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
知音漫客官网漫画下载_知音漫客网页版阅读记录
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
微博网页版直接访问 微博网页版账号管理快速入口
深入理解Go语言中的指针类型:以*string为例
解决J*aScript中重复选择项的确认对话框显示问题
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
php源码怎么看淘宝客系统_看php源码淘宝客系统技巧
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
J*aScript中localStorage数据的获取、清洗与格式化教程
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
使用Pandas转换并合并DataFrame:多列映射至统一结构
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
2025-2030年全球乘用车销量预测:新能源成增长主力
iwriter统一登录平台 iwrite账号密码登录页面
poki网页游戏推荐_poki免费游戏平台入口
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
Typer应用中灵活处理命令行参数的令牌化与解析


2025-12-04
浏览次数:次
返回列表