javascript中的迭代器是什么_如何实现可迭代对象?

发布时间 - 2025-12-27 00:00:00    点击率:
迭代器是定义序列遍历方式的对象,必须有返回{value, done}对象的next()方法;可迭代对象需实现[Symbol.iterator]方法并返回迭代器,才能被for...of等语法消费。

JavaScript 中的迭代器(Iterator)是一个对象,它定义了序列中值的遍历方式;而可迭代对象(Iterable)是指实现了 [Symbol.iterator] 方法的对象,该方法必须返回一个迭代器。简单说:可迭代对象能被 for...of、展开运算符(...)、解构等语法消费,前提是它提供标准的迭代器接口。

迭代器长什么样?

一个迭代器对象必须有一个 next() 方法,每次调用返回形如 { value: ..., done: true|false } 的对象:

  • value:当前迭代出的值(可以是任意类型,包括 undefined
  • done:布尔值,true 表示迭代结束,后续调用应始终返回 { value: undefined, done: true }

例如手动创建一个简单迭代器:

const iterator = {
  items: ['a', 'b', 'c'],
  index: 0,
  next() {
    if (this.index       return { value: this.items[this.index++], done: false };
    }
    return { value: undefined, done: true };
  }
};

console.log(iterator.next()); // { value: 'a', done: false }
console.log(iterator.next()); // { value: 'b', done: false }
console.log(iterator.next()); // { value: 'c', done: false }
console.log(iterator.next()); // { value: undefined, done: true }

如何让一个对象变成可迭代对象?

只需在对象上定义 [Symbol.iterator] 方法,且该方法返回一个符合迭代器协议的对象:

const myRange = {
  from: 1,
  to: 3,
  [Symbol.iterator]() {
    let current = this.from;
    const last = this.to;
    return {
      next() {
        if (current           return { value: current++, done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};

for (const num of myRange) {
  console.log(num); // 1, 2, 3
}
console.log([...myRange]); // [1, 2, 3]

更简洁的实现方式:用生成器函数

生成器函数(function*)天然返回迭代器,是实现可迭代对象最常用、最推荐的方式:

const myRange = {
  from: 10,
  to: 12,
  *[Symbol.iterator]() {
    for (let i = this.from; i       yield i;
    }
  }
};

console.log([...myRange]); // [10, 11, 12]

生成器内部自动处理 valuedone,逻辑清晰,不易出错。

哪些内置类型默认可迭代?

以下类型原生实现了 [Symbol.iterator],因此可直接用于 for...of 等场景:

  • Array、TypedArray
  • String(按 UTF-16 编码单元,注意代理对)
  • Map、Set
  • arguments 对象(非箭头函数内)
  • NodeList 等 DOM 集合(现代浏览器)

注意:Object 默认不可迭代,想遍历其属性需用 Object.keys()Object.entries() 等转成数组再迭代。

基本上就这些。核心就两点:迭代器有 next(),可迭代对象有 [Symbol.iterator]。用好生成器,实现起来很自然。


# javascript  # java  # 可迭代对象 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 配置文件详细介绍  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  如何在自有机房高效搭建专业网站?  Laravel如何生成URL和重定向?(路由助手函数)  iOS正则表达式验证手机号、邮箱、身份证号等  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Android滚轮选择时间控件使用详解  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何在IIS中新建站点并配置端口与物理路径?  利用vue写todolist单页应用  javascript中的try catch异常捕获机制用法分析  Laravel如何处理表单验证?(Requests代码示例)  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  米侠浏览器网页背景异常怎么办 米侠显示修复  Laravel怎么在Controller之外的地方验证数据  高端智能建站公司优选:品牌定制与SEO优化一站式服务  网站建设保证美观性,需要考虑的几点问题!  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  微信小程序 wx.uploadFile无法上传解决办法  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  iOS验证手机号的正则表达式  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel怎么清理缓存_Laravel optimize clear命令详解  EditPlus中的正则表达式 实战(4)  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  大同网页,大同瑞慈医院官网?  如何在万网开始建站?分步指南解析  如何在VPS电脑上快速搭建网站?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  如何用花生壳三步快速搭建专属网站?  Linux系统命令中tree命令详解  音响网站制作视频教程,隆霸音响官方网站?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  详解jQuery中的事件  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  如何在阿里云通过域名搭建网站?