数组entries()返回[index, value]二元数组,可用解构获取索引和值;字符串entries()同理但按码点索引;object.entries()返回[key, value],不提供数字索引。

JavaScript 中 entries() 方法本身不直接返回索引(因为它是为可迭代对象设计的,如数组、Map、Set),但对 数组 调用 entries() 时,它返回的是一个迭代器,每次产出形如 [index, value] 的二元数组。因此,在 for...of 循环中,你可以用解构语法直接拿到索引和值。
数组 entries() 的结构与解构方式
数组的 entries() 返回一个迭代器,其每个元素是长度为 2 的数组:[索引, 对应元素]。利用数组解构,可直接提取这两个部分:
示例:
const arr = ['a', 'b', 'c'];
for (const [index, value] of arr.entries()) {
console.log(index, value); // 0 'a' → 1 'b' → 2 'c'
}
为什么不能直接对普通对象或字符串用 entries() 获取索引?
Object.entries() 返回的是 [key, value],而普通对象的 key 是属性名(非数字索引);String.prototype.entries() 确实也返回 [index, char],但它遍历的是字符串的 Unicode 码点(对多数场景等价于字符索引):
- 数组:✅
arr.entries()→[0, 'a']、[1, 'b']… - 字符串:✅
'abc'.entries()→[0, 'a']、[1, 'b']…(注意代理对、emoji 可能跨多个码点) - 普通对象:❌
Object.entries(obj)返回的是键名,不是数组索引(如['name', 'Alice'])
替代方案:当 entries() 不适用时怎么办?
如果目标不是数组或字符串,但你仍需要“带索引的遍历”,可考虑以下方式:
- 对类数组或可迭代对象:先转成数组再调用
entries(),例如Array.from(iterable).entries() - 对普通对象:用
Object.keys(obj).forEach((key, i) => {...}),其中i是数组索引,key是属性名 - 手动计数:在
for...of外声明let i = 0,循环内递增并使用
注意事项:解构失败与稀疏数组
解构依赖实际产出的数组结构。若迭代器某次返回值不是二元数组(极少见),会报错;另外,稀疏数组(如 [1, , 3])中 entries() 仍会产出 [1, undefined](跳过空位但保留索引),这点与 for...in 或 forEach 行为一致。










