可迭代协议通过Symbol.iterator使对象支持for...of遍历,返回迭代器对象;迭代器协议由next()方法实现,生成器函数以*声明并用yield简化迭代逻辑,自动实现迭代器协议。

J*aScript中的迭代器和生成器是处理数据序列的核心机制,理解它们的工作原理有助于写出更高效、更具可读性的代码。关键在于掌握“可迭代协议”和“迭代器协议”的区别与联系,以及生成器如何简化迭代逻辑。
一个对象如果实现了Symbol.iterator方法,它就是“可迭代的”。这个方法必须返回一个迭代器对象,从而支持for...of循环、展开运算符(...)、Array.from()等语法。
常见内置可迭代对象包括:数组、字符串、Map、Set、arguments 对象等。你也可以为自定义对象实现可迭代性。
例如,让一个对象支持遍历其属性值:
const myObj = {
a: 1,
b: 2,
c: 3,
[Symbol.iterator]() {
const values = Object.values(this);
let index = 0;
return {
next() {
if (index < values.length) {
return { value: values[index++], done: false };
}
return { done: true };
}
};
}
};
<p>for (const val of myObj) {
console.log(val); // 输出 1, 2, 3
}</p>迭代器是一个具有next()方法的对象,每次调用返回一个形如{ value, done }的结果。done 为 true 表示遍历结束。
迭代器本身不需要一次性拥有所有数据,适合处理无限序列或懒加载场景。
手动创建一个计数迭代器:
function createCounter(max) {
let count = 0;
return {
next() {
if (count < max) {
return { value: count++, done: false };
}
return { done: true };
}
};
}
<p>const counter = createCounter(3);
console.log(counter.next()); // { value: 0, done: false }
console.log(counter.next()); // { value: 1, done: false }
console.log(counter.next()); // { value: 2, done: false }
console.log(counter.next()); // { done: true }</p>使用function*定义的生成器函数,调用后会返回一个生成器对象——既是迭代器,也是可迭代对象。
乾坤圈新媒体矩阵管家
新媒体账号、门店矩阵智能管理系统
219
查看详情
通过yield关键字暂停执行并返回值,下次调用next()时从暂停处继续。
重写上面的计数器:
function* counterGenerator(max) {
let count = 0;
while (count < max) {
yield count++;
}
}
<p>const gen = counterGenerator(3);
for (const val of gen) {
console.log(val); // 输出 0, 1, 2
}</p>生成器的优势在于代码简洁,状态自动维护,且天然支持惰性求值。
利用生成器可以轻松实现一些实用功能:
例如,生成斐波那契数列前 n 项:
function* fibonacci() {
let [prev, curr] = [0, 1];
while (true) {
yield curr;
[prev, curr] = [curr, prev + curr];
}
}
<p>for (const num of fibonacci()) {
if (num > 100) break;
console.log(num);
}</p>基本上就这些。掌握可迭代协议和生成器,能让代码更贴近数据流动的本质,写出既直观又高效的迭代逻辑。
以上就是J*aScript迭代器生成器_可迭代协议深入解析的详细内容,更多请关注其它相关文章!
# javascript
# 山西刷关键词排名优化
# 英语seo 目录
# 莆田网站建设企业推荐
# 来宾实用的seo策略
# 北京电子商务网站建设
# 权重 seo 外包
# 中文网
# 相关文章
# 管理系统
# 不需要
# 是一个
# 时计
# 加载
# 运算符
# 遍历
# 迭代
# 可迭代对象
# 区别
# 异步任务
# ai
# 懒加载
# java
# 迭代器
# 广告网站建设创意案例
# 福州抖音seo相关网站
# 5g推广营销图片大全集
# 有seo为什么要竞价
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案
鸿蒙单条备忘录如何加密
发布小红书怎么屏蔽粉丝?屏蔽粉丝能看到吗?
店铺如何关联视频号推广?视频号推广有什么用?
使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤
PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】
小米手机截图后如何查看历史_小米手机截图历史记录查看方法
realme 10 Pro息屏方案_realme 10 Pro省电策略
TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法
作业帮网页版不用下载入口 在线问老师快速答疑
高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法
mysql如何回滚事务_mysql ROLLBACK事务回滚方法
c++如何实现观察者设计模式_c++行为型设计模式实战
火柴人战争网页版在线玩
如何查询国外邮政编码_国外邮政编码查询的多种有效途径
自定义你的VS Code状态栏,监控关键信息
虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口
Excel宏怎么删除_Excel中删除宏的详细操作流程
苹果SE如何开启单手模式_苹果SE单手操作功能
如何在CSS中使用absolute实现登录弹窗居中_transform translate结合
抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?
Linux如何优化系统启动流程_Linux启动项优化方案
Go Template中优雅处理循环最后一项:自定义函数实践
b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法
使用AI在VS Code中将代码从一种语言翻译成另一种
小红书网页版在线直达 小红书网页版免费登录入口
服装短视频如何起号推广?服装短视频起号推广有什么要求?
优化响应式标题底部边框:CSS实现技巧与最佳实践
电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】
发博客与长微博技巧
斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来
阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口
vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足
毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明
《宝可梦大集结》S4冠军之路开始时间介绍
React应用中Commerce.js数据加载与状态管理最佳实践
poki官网最新入口 poki小游戏大全入口
六级准考证号怎么查_四六级准考证查询入口官网
J*aScript模块加载器_RequireJS原理分析
《微信》视频号原创声明开启方法
iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程
uc浏览器官网网页版使用 uc浏览器官网免费在线首页
Google Cloud Functions 时区处理指南:理解与最佳实践
mysql数据库索引类型有哪些_mysql索引类型解析
win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】
批改网网页版登录 批改网电脑版学生登录入口
《绿竹漫游》关闭消息通知方法
Python实战:高效处理实时数据流中的最小/最大值
2025-11-25
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。