首页 游戏 软件 资讯 排行榜 专题
首页
前端开发
如何用 Array.prototype.entries 配合 for...of 在遍历数组的同时获取索引和值

如何用 Array.prototype.entries 配合 for...of 在遍历数组的同时获取索引和值

热心网友
56
转载
2026-04-24

如何用 Array.prototype.entries 配合 for...of 在遍历数组的同时获取索引和值

如何用 Array.prototype.entries 配合 for...of 在遍历数组的同时获取索引和值

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

entries() 返回的是什么类型的迭代器

先说清楚一个核心概念:Array.prototype.entries() 返回的,是一个标准的数组迭代器对象。这意味着,每次调用它的 next() 方法,产出的都是一个长度为 2 的数组,格式固定为 [索引, 值]

这里有个常见的“坑”:它产出的不是对象,也不是 Map 或 Set 结构。所以,如果你试图直接用对象解构的语法,比如写成 { index, value } 去接收,代码肯定会报错——这正是很多开发者初次使用时感到困惑的地方。

好在,当我们使用 for...of 循环时,引擎会自动帮我们处理迭代器的 next() 调用。我们只需要关注:如何优雅地拆开每次循环得到的那个二元数组。

for...of 中正确解构 entries() 的写法

答案很明确:必须使用数组解构语法,并且顺序是固定的——第一个位置放索引,第二个位置放值。

下面是一些典型的对比例子:

  • 正确写法for (const [i, v] of arr.entries()) { ... }。一步到位,清晰简洁。
  • 错误写法for (const {index, value} of arr.entries()) { ... }。如前所述,entries() 不产出对象,此路不通。
  • ⚠️ 低效写法for (const entry of arr.entries()) { const [i, v] = entry; ... }。虽然功能上能达到目的,但多了一次声明和赋值,显得冗余。

来看一个具体的例子,感受一下它的简洁:

const arr = ['a', 'b', 'c'];
for (const [i, v] of arr.entries()) {
  console.log(i, v); // 依次输出:0 'a' → 1 'b' → 2 'c'
}

和 for...in、传统 for 循环比有什么区别

这是个好问题。选择哪种遍历方式,很大程度上取决于你想避开哪些“坑”。

for...in 循环设计初衷是遍历对象的可枚举属性,用在数组上时,它会把索引当作字符串来遍历,更麻烦的是,它可能会遍历到数组原型链上后来添加的属性,或者数组对象本身的非数字属性。这通常不是我们想要的结果。

传统的 for (let i = 0; i < arr.length; i++) 循环当然很强大,一切尽在掌控。但代价是,你需要手动维护索引变量 i,小心处理边界条件。此外,它在迭代器语义层面(比如与某些可迭代协议的配合)不如 for...of 直接。

那么 arr.entries() 配合 for...of 的优势在哪?

  • 精准:它只产出数组自身、按顺序排列的索引-值对,不会有多余的“杂质”。
  • 稳定:即使是稀疏数组(有空位),它也会为每个位置产出对应的索引(值表现为 empty)。
  • 灵活:它返回的迭代器可以被多次消费(只要没耗尽),而 for...of 每次循环都会使用一个新的迭代。

至于性能,在绝大多数现代应用场景中,它与传统 for 循环的差异微乎其微,完全可以忽略。如果一段代码的性能瓶颈真的卡在循环方式上,那更值得审视的,恐怕是循环体内的业务逻辑本身。

遇到空位或 undefined 元素时的行为

这是 Ja vaScript 数组一个比较微妙的点:“空位”(hole)和显式存入的 undefined 值,在底层是不同的。entries() 方法对两者的处理也有区别。

  • 对于空位数组(如 const a = [, , 3];),entries() 会产出:[0, empty], [1, empty], [2, 3]。注意,这里的 empty 表示值真正缺失,并非 undefined
  • 对于显式包含 undefined 的数组(如 const b = [undefined, undefined, 3];),产出则是:[0, undefined], [1, undefined], [2, 3]

for...of 循环中解构时,空位(empty)位置解构出来的 v 也会是 undefined。这就导致了一个问题:你无法通过简单的 v === undefined 来判断,这个位置到底是空位,还是确实存了一个 undefined 值。

如果需要精确区分,就得借助 arr.hasOwnProperty(i) 或者 ES2022 引入的 Object.hasOwn(arr, i) 方法来判断该索引是否为数组的自有属性。

最后,值得再次强调:entries() 是 Array 原型上的方法,它主要服务于标准的 Ja vaScript 数组。对于 TypedArray、类数组对象(如 arguments)或者 NodeList 等,通常需要先将其转换为真正的数组(例如使用 Array.from() 或扩展运算符 ...),或者采用其他更适合的方式来获取索引和值。

来源:https://www.php.cn/faq/2334655.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

安吉尔饮水机温控开关能自己换吗
电脑教程
安吉尔饮水机温控开关能自己换吗

安吉尔饮水机温控开关能自己换吗 理论上,安吉尔饮水机的温控开关确实可以由用户自行更换。但这里有个关键前提:整个操作过程,必须严格遵循安全规范和技术要求,容不得半点马虎。这个小小的开关,通常位于机身背部,采用的是96%手动复位式设计。它身兼两职,既要防止热罐过热,也要杜绝干烧风险。一旦起跳保护,必须手

热心网友
04.24
虚拟内存怎么调最省空间又快?
电脑教程
虚拟内存怎么调最省空间又快?

最省空间又兼顾速度的虚拟内存设置方案 想让电脑运行更流畅,又不希望虚拟内存占用太多宝贵的硬盘空间?一个经过验证的高效方案是:将页面文件手动设置在非系统盘的高速固态硬盘上(比如D盘或F盘),并把初始大小和最大值统一设置为物理内存的1 5倍。这个做法的好处很直接:它既避免了系统为了动态调整页面文件大小而

热心网友
04.24
冰箱夏天调3-4还是5-6噪音小
电脑教程
冰箱夏天调3-4还是5-6噪音小

夏天冰箱调至2–3档通常噪音最小 想让冰箱在炎炎夏日里安静运行,有个简单有效的办法:把温控档位调到2–3档。这可不是随口一说,背后有实测数据支撑。根据安兔兔家电实验室2024年夏季的温控实测,在2–3档这个区间,冰箱压缩机的工作节奏最为舒缓——单次运行时长稳定在8到12分钟,然后能“休息”15到22

热心网友
04.24
监控内存卡怎么格式化最安全
电脑教程
监控内存卡怎么格式化最安全

监控内存卡怎么格式化最安全 说到给监控内存卡格式化,最稳妥、最安全的方法其实有一套标准流程:在设备断电后取出存储卡,通过电脑使用系统自带的格式化工具进行“快速格式化”,并且最关键的一步,是严格按照设备厂商的说明,选择它明确支持的文件系统格式,比如FAT32或者exFAT。这么做的好处是双重的:一方面

热心网友
04.24
路由器怎么改名改密码不影响上网?
电脑教程
路由器怎么改名改密码不影响上网?

路由器改名改密码完全不影响上网,只要操作规范、保存生效并完成设备重连即可无缝过渡 给家里的Wi-Fi改个名、换个密码,这事儿听起来简单,但很多人心里会犯嘀咕:会不会一改完,全家就断网了?其实完全不必担心。只要按照规范流程操作,从修改到生效,你的网络连接、宽带接入乃至网速,都不会有任何中断或影响。整个

热心网友
04.24

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

html中的dialog标签怎么用?
前端开发
html中的dialog标签怎么用?

HTML中的dialog标签怎么用? 很多开发者第一次接触 标签时,都会有个美丽的误会:以为把它写进HTML,页面就会自动弹出一个对话框。其实不然,这个标签的默认状态是“隐藏”的。你可以把它想象成一扇关着的门——写了标签只是造好了门框,想让门打开,你得要么手动加上 open 属性,要么用Ja vaS

热心网友
04.24
如何为响应式下拉菜单添加可点击关闭的“X”按钮
前端开发
如何为响应式下拉菜单添加可点击关闭的“X”按钮

本文介绍如何在基于 CSS 媒体查询和 checkbox 的响应式导航菜单中,通过重构 HTML 结构并结合轻量 Ja vaScript,实现点击汉堡图标展开菜单、再点击右上角“×”按钮即时收起的功能,解决纯 CSS 方案无法主动关闭的问题。 你是否遇到过这样的场景?在移动端,用户点击汉堡图标打开了

热心网友
04.24
如何用 Array.prototype.entries 配合 for...of 在遍历数组的同时获取索引和值
前端开发
如何用 Array.prototype.entries 配合 for...of 在遍历数组的同时获取索引和值

如何用 Array prototype entries 配合 for of 在遍历数组的同时获取索引和值 entries() 返回的是什么类型的迭代器 先说清楚一个核心概念:Array prototype entries() 返回的,是一个标准的数组迭代器对象。这意味着,每次调用它的 next(

热心网友
04.24
伊朗驳斥特朗普所谓分裂内斗
web3.0
伊朗驳斥特朗普所谓分裂内斗

伊朗驳斥特朗普所谓“分裂内斗”论调:美方言论被指为心理投射 近日,围绕伊朗国内局势的表述,美伊之间再次上演了一场外交言辞交锋。这场对话的焦点,似乎已悄然发生了转移。 谈判重心的转向与核心关切的明确 根据伊朗外交部发言人纳赛尔·卡纳尼的表态,一个关键信号已经释放:当前伊美谈判的重心,已不再局限于核问题

热心网友
04.24
HTML怎么做复古风格_html复古怀旧风格页面实现【手册】
前端开发
HTML怎么做复古风格_html复古怀旧风格页面实现【手册】

真正复古的CRT效果需叠加扫描线与亚像素抖动:用repeating-linear-gradient生成2px间距、rgba(0,0,0,0 08)透明度的黑色条纹层,并配以transform: translateX(0 5px) translateY(-0 3px)和steps(1)动画,辅以bac

热心网友
04.24