新闻中心

迭代器协议:Generator函数与Symbol.iterator

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

迭代器协议:generator函数与symbol.iterator

在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

Kreado AI是一个多语言AI视频创作平台,只需输入文本或关键词,即可创作真实/虚拟人物的多语言口播视频。 为创作者提供AI赋能

Kreado AI 182 查看详情 Kreado AI
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最佳实践:动态组件状态管理的组件化方案 

搜索