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

J*aScript 中的遍历机制建立在两个核心协议之上:可迭代协议(Iterable Protocol)和迭代器协议(Iterator Protocol)。这两个协议共同支撑了语言中 for...of 循环、扩展运算符、解构赋值等语法的实现。理解它们有助于深入掌握 J*aScript 的数据遍历逻辑。
一个对象如果实现了 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 使用:
立即学习“J*a免费学习笔记(深入)”;
const myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
};
<p>for (const value of myIterable) {
console.log(value); // 输出 1, 2, 3
}</p>迭代器是一个具有 next() 方法的对象,该方法返回一个包含 value 和 done 属性的结果对象。
迭代器本身也通常是可迭代的,只需在返回的对象上实现 [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 或扩展运算符:
例如:
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遍历机制的详细内容,更多请关注其它相关文章!
# 是一个
# nb-seo.cn
# 草莓视频SEO查询
# 怀化网站建设值得推荐
# 沈阳营销网站建设优势
# 关于seo的岗位有哪些
# 用网络营销知识推广网站
# 台北推广新产品网站
# 安平优化网站公司
# 赛事营销推广图片高清
# 汶上市场seo优化
# 实现了
# javascript
# 服务端
# 源代码
# 自定义
# 有什么
# 数据结构
# 运算符
# 遍历
# 迭代
# 可迭代对象
# node
# java
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
CDR如何复制交互式填充色
《友玩*》创建群聊方法
知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
抖音网页版地址直接进入_抖音网页版在线观看入口
《三国:谋定天下》平民全阶段通用阵容
QQ邮箱注册地址 免费获取QQ邮箱账号
Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】
创建您的便携版VS Code:让配置随身携带
12306夜间购票失败? | 查看官方公布的暂停服务公告与应对方案
《腾讯相册管家》注销账号方法
《豆瓣》私信用户方法
繁花漫画使用教程
TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法
跨语言测试实践:使用Python Selenium测试现有J*a Web项目
iSpring三分屏制作教程
《偃武》甘宁技能详解
如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局
Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南
win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】
AO3官方镜像链接 | 最新防走失网址永久收藏
Final Cut Pro视频加EQ教程
如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现
c++中的const关键字用法大全_c++ const正确使用指南
QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务
路由器DNS怎么设置最快 优化DNS提升上网速度教程
Go App Engine 项目结构与包管理深度指南
优酷官网登录入口电脑版 优酷官网网址入口
Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南
如何在mysql中比较InnoDB和MyISAM区别
263企业邮箱如何设置邮件转发功能
如何在CSS中使用伪类选择器_hover实现悬停效果
使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel
服装短视频如何起号推广?服装短视频起号推广有什么要求?
Linux如何优化系统启动流程_Linux启动项优化方案
英雄联盟争者留名活动介绍
小红书如何引流到私信?引流到私信有用吗?
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
《淘票票》添加到苹果钱包教程
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法
《知到》打卡课程方法
漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程
j*a中赋值运算符是什么?
火柴人战争网页版在线玩
C++ optional用法详解_C++17处理可能为空的返回值
Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
PHP与SQL实践:高效实现数据复制与特定列值修改
优化 WooCommerce 产品价格显示与自定义短代码集成
2025-12-04
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。