新闻中心

J*aScript中什么是迭代器_如何自定义迭代

2025-12-05
浏览次数:
返回列表
迭代器是J*aScript中统一的遍历接口,要求对象实现[Symbol.iterator]方法并返回含next()的对象,next()返回{value, done};自定义对象可通过实现该方法或使用生成器函数(yield)变为可迭代。

javascript中什么是迭代器_如何自定义迭代

迭代器是 J*aScript 中一种统一的遍历接口,它允许你按需逐个访问集合(如数组、字符串、Map、Set 等)中的元素,而无需暴露内部结构。一个对象只要实现了 [Symbol.iterator] 方法,并返回一个符合迭代器协议的对象(即有 next() 方法,返回形如 { value, done } 的对象),它就是可迭代的,就能用 for...of、扩展运算符(...)、解构等语法来消费。

迭代器的核心协议

一个标准的迭代器对象必须满足两个条件:

  • 有一个 next() 方法,每次调用返回一个对象:{ value: 当前值, done: 布尔值(是否遍历完毕) }
  • donetrue 时,value 可选(通常表示返回值或结束信号)

如何让自定义对象可迭代(实现 [Symbol.iterator]

只需在对象上定义一个名为 Symbol.iterator 的方法,它返回一个迭代器对象即可。例如,实现一个从 0 开始、递增到指定上限的数字范围:

class Range {
  constructor(start, end) {
    this.start = start;
    this.end = end;
  }

  [Symbol.iterator]() {
    let current = this.start;
    return {
      next: () => {
        if (current < this.end) {
          return { value: current++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
}

// 使用
for (const num of new Range(2, 5)) {
  console.log(num); // 输出 2, 3, 4
}
console.log([...new Range(0, 3)]); // [0, 1, 2]

更简洁写法:用生成器函数(function*)自定义迭代

生成器函数天然返回迭代器对象,是实现自定义迭代最常用、最简洁的方式:

Moshi Chat Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

Moshi Chat 160 查看详情 Moshi Chat
class Countdown {
  constructor(from) {
    this.from = from;
  }

  *[Symbol.iterator]() {
    for (let i = this.from; i > 0; i--) {
      yield i;
    }
  }
}

console.log([...new Countdown(3)]); // [3, 2, 1]

注意:yield 每次暂停并产出一个值,next() 调用会恢复执行直到下一个 yield 或函数结束;函数结束后自动返回 { done: true }

实际中要注意的细节

  • 迭代器只能使用一次:一旦 done: true,后续 next() 仍返回 { value: undefined, done: true },不会重置
  • 如果想支持多次遍历,[Symbol.iterator] 方法应每次返回**新的迭代器对象**(不能复用同一个闭包状态)
  • 原生类型(Array、String、Map、Set、TypedArray、arguments、NodeList)都默认实现了 [Symbol.iterator]
  • 普通对象({})默认不可迭代,除非手动添加该方法

基本上就这些。掌握迭代器协议和生成器,就能灵活控制数据的消费方式,也是理解 async/await、RxJS 等异步流工具的基础。

以上就是J*aScript中什么是迭代器_如何自定义迭代的详细内容,更多请关注其它相关文章!


# 文件上传  # 李嘉乐全网营销策划推广  # 山西推广营销策划供应  # 网站优化公司收费标准  # 宁波seo转化率  # 信誉好的郑州网站优化  # 珠海网站建设改版  # 网络营销推广老梁是谁呀  # 山西营销推广投放  # j网店家具线上营销与推广方案  # 淘宝seo推广技巧  # 实现了  # 有何不同  # javascript  # 如何实现  # 键值  # 如何使用  # 运算符  # 遍历  # 自定义  # 迭代  # ai  # 工具  # node  # js  # java 


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


相关推荐: Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  J*aScript中在Map循环中检测并处理空数组元素  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  漫蛙漫画官方首页 漫蛙2漫画在线阅读入口  顺丰快递查询系统 官方正版查询入口  DLsite中文平台入口 DLsite官网内容在线查看  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  Python大型XML文件高效流式解析教程  Pygame教程:解决用户输入与游戏状态更新不同步问题  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  随机参数递归函数的基准调用次数与时间复杂度探究  学习通网页版快速入口 学习通官网网页版直接打开  Mac怎么锁定备忘录_Mac备忘录加密设置教程  支付宝如何设置安全保护_支付宝安全设置的全面教程  在哪找SublimeJ远程工具_SFTP插件配置教程  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  Discord Slash 命令响应超时问题的异步解决方案  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  b站怎么删除评论_b站评论管理与删除操作  Kafka Streams中基于消息头条件过滤消息的实现指南  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  mc.js游戏直达 mc.js网页免下载版本秒进地址  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  创客贴用户入口官网登录 创客贴网页版电脑版系统  解决Django多数据库/多Schema环境下外键迁移问题  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  反效果?《战地6》免费试玩开启后玩家数不升反降  晋江读书网页版在线登录 晋江读书电脑版官网  CSS布局中意外空白:解决padding-top导致的顶部间距问题  b站如何看历史记录_b站观看历史找回方法  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  精准捕获:如何在页面中监听除特定元素外的所有点击事件  抖音怎么赚钱_抖音创作者变现方法与途径指南  大麦的“候补”是什么意思 大麦候补购票规则【详解】  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染 

搜索