for...of 配合 entries() 可获取索引和值并修改原数组;entries() 返回一次性可迭代对象,产出 [index, value] 数组,支持解构赋值;修改需通过 arr[index] = ...,而非直接赋值循环变量。

ES6 的 for...of 循环本身不提供索引,但搭配数组的 entries() 方法就能轻松拿到索引和值,并支持修改原数组。
entries() 返回的是索引-值配对的迭代器
arr.entries() 不返回普通数组,而是返回一个可迭代对象,每次迭代产出一个形如 [index, value] 的数组。这个结构天然适配解构赋值,是 for...of 的理想搭档。
- 它只遍历数组自身的元素,不包含原型属性或稀疏空位
- 返回的迭代器是“一次性”的,多次使用需重新调用
entries() - 与
keys()(只取索引)和values()(只取值)形成完整组合
语法写法:用解构直接接收 index 和 value
在 for...of 中直接写 const [index, value] of arr.entries(),JS 会自动把每次产出的二元数组拆开赋值:
const colors = ['Red', 'Green', 'Blue'];
for (const [index, color] of colors.entries()) {
console.log(`${color} is at index ${index}`);
}
// 输出:
// Red is at index 0
// Green is at index 1
// Blue is at index 2
修改原数组:通过索引赋值,不是改循环变量
注意:for...of 中的 value 是副本,直接赋值不会影响原数组。要修改,必须用 arr[index] = ...:
const nums = [1, 2, 3, 4];
for (const [i, val] of nums.entries()) {
nums[i] = val * 10; // ✅ 正确:通过索引操作原数组
}
console.log(nums); // [10, 20, 30, 40]
- 如果是对象数组,也可直接修改对象属性(因引用关系),但修改数组项本身仍需索引
- 该方式比
forEach更灵活,支持break、continue等流程控制
兼容性与替代方案
entries() 在现代浏览器和 Node.js(v6+)中已全面支持。若需兼容极老环境,可用传统 for 循环或 Array.prototype.keys() 配合 arr[i] 手动取值。











