新闻中心

J*aScript 迭代器:实现可迭代对象与迭代器协议

2025-11-05
浏览次数:
返回列表
迭代器协议要求对象有next方法返回{value, done},可迭代协议要求对象实现Symbol.iterator方法;2. for...of通过Symbol.iterator获取迭代器并调用next遍历;3. 示例Counter类通过Symbol.iterator返回带next方法的对象实现遍历。

javascript 迭代器:实现可迭代对象与迭代器协议

在 J*aScript 中,迭代器(Iterator)和可迭代对象(Iterable)是处理集合数据的核心机制。它们让数组、字符串、Map 等原生类型可以被 for...of 循环遍历,同时也为自定义数据结构提供统一的迭代方式。理解并实现迭代器协议,有助于写出更灵活、兼容性更强的代码。

什么是迭代器协议与可迭代协议?

J*aScript 使用两个相关但不同的协议来定义如何遍历对象:

  • 可迭代协议(Iterable Protocol):规定一个对象是否可被遍历。只要对象实现了 Symbol.iterator 方法,它就是可迭代的。
  • 迭代器协议(Iterator Protocol):定义一个对象如何逐个返回值,并表明是否遍历完成。迭代器必须有 next() 方法,返回格式为 { value: any, done: boolean } 的对象。

当你在 for...of 中使用一个对象时,J*aScript 会自动调用它的 [Symbol.iterator]() 方法获取迭代器,然后反复调用该迭代器的 next() 方法,直到 done: true

手动实现一个可迭代对象

下面是一个简单的计数器类,它既是可迭代对象,也返回一个符合迭代器协议的对象:

class Counter {
  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 { value: undefined, done: true };
        }
      }
    };
  }
}

// 使用示例
const counter = new Counter(1, 3);
for (const num of counter) {
  console.log(num); // 输出 1, 2, 3
}

这里,Counter 类实现了 [Symbol.iterator] 方法,每次调用都返回一个新的迭代器对象。这样就能支持多次遍历,互不干扰。

让自定义数据结构可迭代

假设你写了一个简单的范围类 Range,表示一个整数区间。为了让它能被 for...of 遍历,只需加上 [Symbol.iterator]

BrandCrowd BrandCrowd

一个在线Logo免费设计生成器

BrandCrowd 200 查看详情 BrandCrowd
class Range {
  constructor(from, to) {
    this.from = from;
    this.to = to;
  }

  [Symbol.iterator]() {
    let value = this.from;
    return {
      next: () => {
        if (value <= this.to) {
          return { value: value++, done: false };
        }
        return { done: true };
      }
    };
  }
}

const range = new Range(5, 8);
console.log([...range]); // [5, 6, 7, 8]

现在 Range 实例可以用于展开运算符、for...ofArray.from() 等所有接受可迭代对象的地方。

迭代器的复用与状态管理

注意,每个 [Symbol.iterator]() 调用应返回一个独立的迭代器。这保证了多个循环不会互相影响:

const r = new Range(1, 2);
const iter1 = r[Symbol.iterator]();
const iter2 = r[Symbol.iterator]();

console.log(iter1.next()); // { value: 1, done: false }
console.log(iter2.next()); // { value: 1, done: false } —— 不受影响

如果返回的是同一个迭代器实例,第二次遍历时可能已经结束。因此通常在 [Symbol.iterator] 内部创建并返回新的迭代器对象,确保状态隔离。

基本上就这些。掌握迭代器协议后,你可以让任何数据结构融入 J*aScript 的遍历生态,写出更自然、更通用的 API。不复杂但容易忽略。

以上就是J*aScript 迭代器:实现可迭代对象与迭代器协议的详细内容,更多请关注其它相关文章!


# 端到  # 长沙seo外包怎么样  # 全自动洗碗机软推广营销  # 大塘关键词排名方法  # 济南seo关键词排名查询工具  # 东莞seo教程  # 郑州seo发展前景  # 杨先生seo  # 赵县品牌网站推广的价格  # 迎客楼网站建设素材图  # 广州问答营销推广平台  # 的是  # javascript  # 如何实现  # 如何用  # 命令行  # 自定义  # 运算符  # 数据结构  # 遍历  # 迭代  # 可迭代对象  # java 


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


相关推荐: 生成rdflib自定义SPARQL函数:参数匹配与实践指南  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  高德地图怎么看全景照片_高德地图全景照片浏览教程  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  Excel Power Pivot如何处理XML数据源 构建高级数据模型  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  如何使用Node.js csv 包按条件移除含空字段的CSV记录  在VS Code中配置和运行Dart程序的完整步骤  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  2026年CSGO开箱网站推荐 CSGO开箱平台精选  AO3同人作品网入口 AO3搜索引擎官网永久地址  mc.js游戏直达 mc.js网页免下载版本秒进地址  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  Pandas DataFrame 多条件优先级排序与排名  学习通网页版快速入口 学习通官网网页版直接打开  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  从J*aScript对象中精确提取指定属性的教程  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  2026春节假期票务安排_2026春节放假购票指南  J*aScript中正确使用querySelectorAll与复杂CSS选择器  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  58动漫网在线官方网 58动漫网正版动漫入口网址  yy漫画网页版官方入口_yy漫画官网登录页面链接  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  如何使 Jest 模拟函数默认抛出错误以提高测试效率  qq游戏跨平台入口_qq游戏多设备同步登录  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  Discord Slash 命令响应超时问题的异步解决方案  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  Fabric模组开发:自定义物品与物品组的现代管理方法  最新韩小圈网页版登录入口_官网在线观看官方链接  蛙漫2台版漫画地址 Manwa2正版网页版链接  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  谷歌推RCS信息存档功能:公司可监控员工私密信息!  J*aScript中向JSON对象添加新属性的正确姿势  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  如何在Promise链中优雅地中断后续then执行  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  VS Code远程开发时如何处理文件权限问题  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  天眼查企业查询官网入口 天眼查官方网页版查询  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】 

搜索