数组entries()返回索引-值配对迭代器,for...of解构[i,v]可直接获取;键恒为连续数字索引,稀疏数组跳过空位不补;区别于object/map.entries()的非数字键;非数组需转array或手动计数。

ES6 数组的 entries() 方法返回一个迭代器,每次产出一个形如 [index, value] 的数组。在 for...of 循环中直接解构就能同时拿到键(即索引)和值,无需额外处理。
用 for...of + 解构最简洁
数组的 entries() 中,键就是数字索引,天然对应位置顺序,解构时按 [index, value] 写即可:
const arr = ['a', 'b', 'c'];for (const [i, v] of arr.entries()) { console.log(i, v); }- 输出:0 'a' → 1 'b' → 2 'c'
注意 key 始终是数字,不管数组是否稀疏
即使数组有空位或用 delete 删除过元素,entries() 返回的 key 仍是连续数字索引:
const arr = ['x', , 'z']; delete arr[1];for (const [i, v] of arr.entries()) console.log(i, v);- 仍输出:0 'x' → 2 'z'(跳过 index 1,但不会补位)
别和 Object.entries() 或 Map.entries() 混淆
对象和 Map 的 entries() 返回的 key 不是索引:
-
Object.entries({ a: 1 })→ key 是字符串'a' -
new Map([['x', 1]]).entries()→ key 是你存的键(如'x'),不是 0 - 只有数组的
entries()才保证 key 是递增数字索引
需要编号但不是原生数组?转成数组再遍历
比如 Set、自定义可迭代对象,本身不带索引,又想编号:
Array.from(set).forEach((item, i) => console.log(i, item));- 或手动计数:
let i = 0; for (const item of set) console.log(i++, item);











