新闻中心
J*aScript中什么是迭代器_如何自定义迭代
迭代器是J*aScript中统一的遍历接口,要求对象实现[Symbol.iterator]方法并返回含next()的对象,next()返回{value, done};自定义对象可通过实现该方法或使用生成器函数(yield)变为可迭代。

迭代器是 J*aScript 中一种统一的遍历接口,它允许你按需逐个访问集合(如数组、字符串、Map、Set 等)中的元素,而无需暴露内部结构。一个对象只要实现了 [Symbol.iterator] 方法,并返回一个符合迭代器协议的对象(即有 next() 方法,返回形如 { value, done } 的对象),它就是可迭代的,就能用 for...of、扩展运算符(...)、解构等语法来消费。
迭代器的核心协议
一个标准的迭代器对象必须满足两个条件:
- 有一个
next()方法,每次调用返回一个对象:{ value: 当前值, done: 布尔值(是否遍历完毕) } - 当
done为true时,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 };
} els
e {
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
法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。
160
查看详情
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优化渲染


2025-12-05
浏览次数:次
返回列表
e {
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]