新闻中心
J*aScript中的迭代器与生成器_j*ascript ES6
迭代器是符合next()方法返回value和done的对象,生成器函数用function*定义并返回可迭代的生成器对象。

J*aScript中的迭代器和生成器是ES6引入的重要特性,它们让数据遍历和异步编程更加简洁高效。理解这两个概念有助于写出更清晰、更具可读性的代码。
什么是迭代器(Iterator)
迭代器是一种设计模式,在J*aScript中表现为一个对象,该对象符合迭代器协议:拥有一个next()方法,返回包含value和done两个属性的对象。
当done为true时,表示遍历结束;value则是当前的值。
很多内置类型如数组、字符串、Map、Set都默认实现了Symbol.iterator方法,因此可以被for...of循环遍历。
手动创建一个迭代器的例子:
const myArray = [1, 2, 3];
const iterator = myArray[Symbol.iterator]();
<p>iterator.next(); // { value: 1, done: false }
iterator.next(); // { value: 2, done: false }
iterator.next(); // { value: 3, done: false }
iterator.next(); // { value: undefined, done: true }</p>什么是生成器(Generator)
生成器是一种特殊函数,使用function*定义,并通过yield关键字暂停执行。调用生成器函数不会立即运行其内部代码,而是返回一个生成器对象,这个对象既是迭代器,也是可迭代对象。
每次调用生成器对象的next()方法,函数会从上次暂停的地方继续执行,直到遇到下一个yield或函数结束。
示例:
Mureka
Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。
1091
查看详情
function* count() { yield 1; yield 2; yield 3; } <p>const gen = count(); gen.next(); // { value: 1, done: false } gen.next(); // { value: 2, done: false } gen.next(); // { value: 3, done: false } gen.next(); // { value: undefined, done: true }</p>
生成器的优势与应用场景
生成器让开发者可以用同步写法处理异步逻辑,虽然现在已被async/await取代,但它在某些场景仍有价值。
- 惰性求值:只在需要时计算下一个值,适合处理大数据流或无限序列
- 状态保持:函数执行状态在yield后保留,恢复时上下文不变
- 简化异步流程控制:配合Promise可实现类似协程的效果
比如创建一个无限计数生成器:
function* infiniteCounter() {
let i = 0;
while (true) {
yield i++;
}
}
<p>const counter = infiniteCounter();
counter.next().value; // 0
counter.next().value; // 1
counter.next().value; // 2</p>可迭代协议与for...of的工作原理
一个对象如果实现了Symbol.iterator方法,并且该方法返回一个迭代器,那么它就是“可迭代的”。
for...of循环本质上会自动调用对象的[Symbol.iterator]()方法,然后反复调用next(),直到done为true。
你可以为自定义对象添加迭代能力:
const myRange = {
from: 1,
to: 5,
*[Symbol.iterator]() {
for (let i = this.from; i <= this.to; i++) {
yield i;
}
}
};
<p>for (const num of myRange) {
console.log(num); // 1, 2, 3, 4, 5
}</p>基本上就这些。迭代器和生成器扩展了J*aScript的表达能力,尤其在处理数据流、构建工具函数时非常实用。虽然日常开发中直接使用生成器不多,但理解它们有助于深入掌握语言机制。
以上就是J*aScript中的迭代器与生成器_j*ascript ES6的详细内容,更多请关注其它相关文章!
# 如何实现
# SEO分析检验专业推荐
# 抖音seo热线电话
# 青海seo线上营销方法
# 东莞神马seo推广费用
# 永州seo服务优化
# 营销推广的另类玩法
# 地产四季度营销推广计划
# 淘宝seo分词在线
# 贵阳市网站关键词排名
# 鼓楼网站优化
# 实现了
# 搜索功能
# javascript
# 创建一个
# 时计
# 有哪些
# 是一种
# 如何用
# 遍历
# 迭代
# 可迭代对象
# ai
# 大数据
# java
# es6
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
汽水音乐在线版入口_汽水音乐网页播放手册
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
将HTML动态表格多行数据保存到Google Sheet的教程
小米汽车11月交付量突破40000台!雷军:将继续努力
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
如何在CSS中使用浮动制作导航栏_float实现水平菜单
VS Code远程开发时如何处理文件权限问题
如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化
百度网盘网页版入口 百度网盘网页版官方登录网址
期待已久:小米17 Ultra、小米首款NAS本月登场
漫蛙2正版漫画站 漫蛙2网页版快速访问入口
MongoDB聚合管道:正确匹配对象数组中_id的方法
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
poki网页游戏推荐_poki免费游戏平台入口
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
Flexbox布局实践:实现粘性导航栏与底部固定页脚
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
Fabric模组开发:自定义物品与物品组的现代管理方法
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
yandex入口引擎手机版 yandex安卓版下载入口
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
如何使用纯J*aScript判断Input元素是否在特定类容器内
J*aScript数组对象转换:按指定键分组与值收集
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】
如何更改在 Excel 中打开超链接时的默认浏览器
J*a TimerTask中HashMap意外清空的深层原因与解决方案
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
必由学官网快捷入口 必由学网页版在线学习平台
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
html5 app怎么运行环境_配html5 app运行环境【教程】
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
Python Socket多播通信中指定源IP地址的实践指南
vivo云服务网页版登录 怎么登录vivo云服务网页版
谷歌学术网站直达地址 谷歌学术搜索网页版一键进入


2025-11-01
浏览次数:次
返回列表
t() {
yield 1;
yield 2;
yield 3;
}
<p>const gen = count();
gen.next(); // { value: 1, done: false }
gen.next(); // { value: 2, done: false }
gen.next(); // { value: 3, done: false }
gen.next(); // { value: undefined, done: true }</p>