Array.prototype.entries()配合for...of可直接解构出索引和值,返回形如[index, value]的键值对数组,按实际索引顺序遍历,跳过稀疏数组中的空位。

直接用 Array.prototype.entries() 配合 for...of,就能一次解构出索引和值,不需要额外计数器或 forEach。
entries() 返回的是可迭代的 [index, value] 数组
entries() 方法返回一个迭代器,每次调用 next() 会产出形如 [0, 'a']、[1, 'b'] 的键值对数组,其中第一个元素是索引(number),第二个是对应元素(任意类型)。
在 for...of 中可以直接用数组解构语法接收:
-
✅ 正确写法:
for (const [index, value] of arr.entries()) { ... } -
❌ 错误写法:
for (const item of arr.entries())—— 这时item是整个[index, value]数组,需再解构才能用
实际使用示例
比如处理一个字符串数组:
const fruits = ['apple', 'banana', 'cherry'];
for (const [i, fruit] of fruits.entries()) {
console.log(`索引 ${i}: ${fruit}`);
}
// 输出:
// 索引 0: apple
// 索引 1: banana
// 索引 2: cherry
也适用于数字、对象等任意类型数组,包括空数组(循环不执行)和稀疏数组(只遍历存在的索引)。
对比其他常用方式
相比传统写法,更简洁且语义清晰:
- 不用
for (let i = 0; i 手动维护索引 - 不用
arr.forEach((value, index) => {...})(无法用break/continue控制流程) - 比
for (const entry of arr.entries())再写const [i, v] = entry少一层嵌套
注意点
entries() 是浅层迭代,不递归;它按数组实际索引顺序遍历,跳过未定义但已声明的“空位”(如 [1, , 3] 中索引 1 不会被访问)。
如果需要兼容老旧环境(如 IE),需搭配 Babel 转译或使用 polyfill。










