新闻中心
迭代器协议:Generator函数与Symbol.iterator
答案是Symbol.iterator方法使对象可迭代,通过实现该方法并返回具有next()的迭代器对象,可让自定义结构支持for...of和扩展运算符,如数组、字符串等内置类型均遵循此协议。

在J*aScript中,迭代器协议定义了对象如何被遍历。实现这一协议的关键是 Symbol.iterator 方法和能够生成迭代器的 Generator函数。它们让自定义数据结构支持 for...of 循环和扩展运算符等语法。
Symbol.iterator 与可迭代协议
一个对象如果实现了 Symbol.iterator 方法,就被称为可迭代对象。这个方法必须返回一个迭代器对象,该对象具备 next() 方法,用于逐步获取值。
例如,数组、字符串、Map 等内置类型都实现了 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 myCollection = {
items: ['a', 'b', 'c']
,
[Symbol.iterator]() {
let i = 0;
return {
next: () => {
return i < this.items.length
? { value: this.items[i++], done: false }
: { done: true };
}
};
}
};
之后就能直接使用 for...of:
for (const item of myCollection) {
console.log(item); // 输出 a, b, c
}
Generator 函数简化迭代器创建
手动实现 next() 和状态管理比较繁琐。Generator 函数(用 function* 定义)能自动返回一个符合迭代器协议的对象,极大简化过程。
每次调用 yield,都会暂停执行并返回一个 { value, done } 对象:
Kreado AI
Kreado AI是一个多语言AI视频创作平台,只需输入文本或关键词,即可创作真实/虚拟人物的多语言口播视频。 为创作者提供AI赋能
182
查看详情
function* gen() {
yield 1;
yield 2;
yield 3;
}
<p>const g = gen();
g.next(); // { value: 1, done: false }
g.next(); // { value: 2, done: false }</p>利用这一点,我们可以更简洁地实现 Symbol.iterator:
const myCollection = {
items: ['x', 'y', 'z'],
*[Symbol.iterator]() {
for (const item of this.items) {
yield item;
}
}
};
现在同样可以使用 for...of 遍历,代码更清晰易读。
结合使用的优势
Generator 函数天然符合迭代器协议,因此非常适合用来实现 Symbol.iterator 方法。这种方式既保持了逻辑简洁,又支持延迟计算(惰性求值),适合处理大量或无限数据流。
比如实现一个无限计数器:
const counter = {
*[Symbol.iterator]() {
let i = 0;
while (true) yield i++;
}
};
<p>// 取前5个值
for (const num of counter) {
if (num > 4) break;
console.log(num); // 0,1,2,3,4
}</p>基本上就这些。通过 Generator 和 Symbol.iterator 的配合,J*aScript 提供了一致且灵活的遍历机制。
以上就是迭代器协议:Generator函数与Symbol.iterator的详细内容,更多请关注其它相关文章!
# java
# 可迭代对象
# 关键词
# 迭代
# 遍历
# 如何实现
# javascript
# 福建关键词排名有效果吗
# 临沂seo服务
# 济宁关键词seo
# 福建专业seo优化欢迎咨询
# 海口外卖推广员招聘网站
# 子洲网站建设开发
# 找文献网站建设
# 宜城企业网站建设
# seo 竞价流量
# 网站评论区对seo
# 是一个
# 多语言
# 如何处理
# 运算符
# 自定义
# 数据结构
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
excel如何生成目录 excel一键生成工作表目录超链接
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
C++如何解决segmentation fault_C++段错误调试与原因分析
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
快手官方唯一登录入口 谨防山寨钓鱼网站
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
曝R星经典之作开发图 设计简陋但信息密集!
探索高级语言到原生C/C++的转译:挑战与内存管理策略
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
夸克浏览器图书入口 夸克手机浏览器阅读入口
新手怎么开始学化妆 零基础化妆入门教程
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
快手网页版在线登录 快手网页版官网入口快速访问
小米Civi 4录制视频过暗_小米Civi 4亮度优化
德邦快递查询平台 德邦快递物流信息查询入口
Python模块化编程:有效管理依赖与避免循环引用
J*aScript教程:根据元素文本内容动态设置背景色
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
Lar*el DB::listen 事件中的查询执行时间单位解析
深入理解Promise链:如何在catch后中断then的执行
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突
深入理解J*a链表中的IPosition接口与使用
葱吃多了会怎样 葱吃多了会伤胃吗
Android Studio计算器C键功能异常排查与修复教程
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
c++如何使用Meson构建系统_c++比CMake更快的构建工具
iCloud登录入口网页版 苹果iCloud官网登录
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
qq游戏手机版下载安装_qq游戏移动端入口
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
智慧团建扫码登录入口 智慧团建扫码登录入口官网版
快手赚钱渠道_快手收益来源
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
必由学官网首页入口 必由学教师网页版登录指南
qq游戏跨平台入口_qq游戏多设备同步登录
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
J*aScript实现单选按钮与关联输入框的联动禁用教程
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明
React Hooks最佳实践:动态组件状态管理的组件化方案


2025-11-19
浏览次数:次
返回列表
,
[Symbol.iterator]() {
let i = 0;
return {
next: () => {
return i < this.items.length
? { value: this.items[i++], done: false }
: { done: true };
}
};
}
};