新闻中心
J*aScript迭代器_可迭代协议实现原理
迭代器协议要求对象实现next()方法,返回包含value和done属性的对象;2. 可迭代协议通过Symbol.iterator定义,使对象能被for...of等语法使用;3. 实现二者可自定义遍历行为,提升数据结构灵活性。

J*aScript 中的迭代器和可迭代协议是实现自定义遍历行为的核心机制。它们让对象能够被 for...of 循环、展开运算符(...)、Array.from() 等语法直接使用。理解其原理有助于我们写出更灵活、符合语言习惯的数据结构。
迭代器协议:定义如何逐步访问数据
迭代器协议规定了一个对象必须提供一个 next() 方法,该方法返回一个包含 value 和 done 属性的对象:
- value:当前步骤的值,可以是任意类型
- done:布尔值,表示遍历是否结束。true 表示结束,false 表示还有更多数据
下面是一个手动实现的简单计数器迭代器:
function createCounter(max) {
let current = 0;
return {
next() {
if (current < max) {
return { value: current++, done: false };
} else {
return { done: true };
}
}
};
}
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 }
可迭代协议:告诉 J*aScript 这个对象能被遍历
一个对象要成为“可迭代对象”,必须实现 [Symbol.iterator]() 方法。这个方法不接收参数,返回一个符合迭代器协议的对象。
常见的可迭代对象包括数组、字符串、Map、Set 等。我们可以为任意对象添加这一方法使其支持 for...of。
例如,让一个类支持迭代:
语鲸
AI智能阅读辅助工具
314
查看详情
class NumberRange {
constructor(start, end) {
this.start = start;
this.end = end;
}
[Symbol.iterator]() {
let current = this.start;
const end = this.end;
return {
next() {
if (current <= end) {
return { value: current++, done: false };
} else {
return { done: true };
}
}
};
}
}
const range = new NumberRange(1, 3);
for (const num of range) {
console.log(num); // 输出 1, 2, 3
}
生成器函数:简化迭代器创建
手动写 next() 容易出错且繁琐。ES6 提供了生成器函数(generator),用 function* 定义,内部使用 yield 返回值,自动实现迭代器协议。
上面的 NumberRange 可以更简洁地写成:
class NumberRange {
constructor(start, end) {
this.start = start;
this.end = end;
}
*[Symbol.iterator]() {
for (let i = this.start; i <= this.end; i++) {
yield i;
}
}
}
生成器函数调用后返回一个生成器对象,它既是迭代器,也是可迭代对象,天然符合协议要求。
基本上就这些。掌握迭代器和可迭代协议,就能让自定义数据结构无缝融入 J*aScript 的遍历生态。关键点是理解 next() 的结构和 [Symbol.iterator] 的作用,再利用生成器简化实现。不复杂但容易忽略细节。
以上就是J*aScript迭代器_可迭代协议实现原理的详细内容,更多请关注其它相关文章!
# 按需
# 网站建设和管理的现状
# 海南比较好的seo
# 天猫内容营销推广有意义吗
# 王坟网站优化流程
# 软文营销推广咨询
# 凌一贤SEO培训
# 移动端seo的发展历程
# 浙江谷歌推广网络营销
# 网站海外推广运营简历
# seo计费系统接口
# 是一个
# javascript
# 如何用
# 管理器
# 运算符
# 自定义
# 如何使用
# 数据结构
# 遍历
# 迭代
# 可迭代对象
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何在 Excel Online 和 Google 表格中更改日期格式
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
mcjs网页版在线存档 mcjs云存档登录入口
提升Kafka消费者健壮性:会话超时处理与消息处理语义
J*a应用程序首次运行自动创建文件与目录的最佳实践
离线运行Go语言之旅:本地部署与GOPATH配置指南
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
steam官方网页快速访问 steam账号注册全流程
解决Bootstrap卡片顶部边距导致背景图下移的问题
深入理解Promise链:如何在catch后中断then的执行
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
在python-socketio事件处理器中安全访问Flask应用上下文
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
Pygame教程:解决用户输入与游戏状态更新不同步问题
邮政快递包裹最新位置 邮政快递实时追踪入口
从OpenAI API响应中高效提取生成文本
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
Python自定义类排序:解决lambda键值访问TypeError的实践指南
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
谷歌邮箱注册显示错误Gmail服务器异常与延迟处理
Excel Power Pivot如何处理XML数据源 构建高级数据模型
qq游戏免费畅玩入口_qq游戏电脑版快速启动
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
React Router v6 教程:构建认证保护的私有路由与重定向策略
绝地鸭卫平a核爆刀流玩法攻略
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
铃兰之剑为这和平的世界希里技能组及加点推荐
CSS子选择器:如何区分并样式化嵌套列表的子层级
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
AO3网页版最新入口合集 Archive of Our Own在线访问指南
漫蛙2漫画入口 漫蛙正版网页漫画直达网址
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
实现分段式页面滚动导航:CSS与J*aScript教程
Golang如何使用context实现超时取消_Golang context超时取消模式实践
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
星露谷物语官网入口 星露谷物语游戏官网入口
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
如何在CSS中使用浮动制作导航栏_float实现水平菜单
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
Pandas DataFrame 多条件优先级排序与排名


2025-11-25
浏览次数:次
返回列表