新闻中心

J*aScript迭代协议详解_j*ascript遍历机制

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

javascript迭代协议详解_javascript遍历机制

J*aScript 中的遍历机制建立在两个核心协议之上:可迭代协议(Iterable Protocol)和迭代器协议(Iterator Protocol)。这两个协议共同支撑了语言中 for...of 循环、扩展运算符、解构赋值等语法的实现。理解它们有助于深入掌握 J*aScript 的数据遍历逻辑。

可迭代协议(Iterable Protocol)

一个对象如果实现了 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 使用:

const myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
};
<p>for (const value of myIterable) {
console.log(value); // 输出 1, 2, 3
}</p>

迭代器协议(Iterator Protocol)

迭代器是一个具有 next() 方法的对象,该方法返回一个包含 valuedone 属性的结果对象。

  • value:当前迭代的值,可以是任意类型。
  • done:布尔值,表示迭代是否完成。为 true 时表示遍历结束。

迭代器本身也通常是可迭代的,只需在返回的对象上实现 [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 或扩展运算符:

  • Array
  • String
  • TypedArray(如 Uint8Array)
  • Map
  • Set
  • arguments 对象
  • DOM 集合(如 NodeList)部分支持

例如:

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遍历机制的详细内容,更多请关注其它相关文章!


# 文件上传  # 网站网络推广行业  # 文旦SEO  # seo提高  # 太原百度关键词排名软件  # 大连长海网站推广  # 新网站建设怎么建设才好  # 浙江网站营销推广招聘网  # 嘉定营销推广平台有哪些  # 一戈seo24乌鲁木齐网站推广v1  # 平山自制网站建设招标公告  # 是一个  # javascript  # 如何实现  # 键值  # 如何使用  # 自定义  # 数据结构  # 运算符  # 遍历  # 迭代  # 可迭代对象  # node  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 必由学官网快捷入口 必由学网页版在线学习平台  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  解决Django多数据库/多Schema环境下外键迁移问题  CSS布局中意外空白:解决padding-top导致的顶部间距问题  微信网页版官方快速登录入口 微信网页版网页版账号直达  Excel Power Pivot如何处理XML数据源 构建高级数据模型  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  快手网页版在线登录 快手网页版官网入口快速访问  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  mc.js游戏直达 mc.js网页免下载版本秒进地址  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  Golang如何优雅处理error_Golang error处理最佳实践总结  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  Tabulator表格中精确实现日期时间排序的指南  知音漫客正版漫画平台_知音漫客官网账号登录  163邮箱官方主页登录 直达网易邮箱登录核心页面  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  知音漫客官网漫画下载_知音漫客网页版阅读记录  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  微博网页版直接访问 微博网页版账号管理快速入口  深入理解Go语言中的指针类型:以*string为例  解决J*aScript中重复选择项的确认对话框显示问题  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  J*aScript中localStorage数据的获取、清洗与格式化教程  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  使用Pandas转换并合并DataFrame:多列映射至统一结构  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  2025-2030年全球乘用车销量预测:新能源成增长主力  iwriter统一登录平台 iwrite账号密码登录页面  poki网页游戏推荐_poki免费游戏平台入口  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  Typer应用中灵活处理命令行参数的令牌化与解析 

搜索