修改原数组元素值必须通过索引赋值:for循环中用arr[i]=新值,或forEach中用array[index]=新值;map等方法仅返回新数组,不修改原数组。

直接通过 for 循环或 forEach 遍历时,若想修改原数组元素值,关键在于**操作数组的索引位置(而非遍历得到的值本身)**。因为 JavaScript 中基本类型(如数字、字符串)是按值传递的,单纯修改循环变量不会影响原数组。
用 for 循环 + 索引赋值(最常用、最可靠)
这是最直观且 100% 有效的方式:利用循环变量 i 作为下标,直接给 arr[i] 赋新值。
- ✅ 修改生效:直接写入原数组指定位置
- ✅ 兼容性好:所有环境都支持
- ✅ 可随时 break/continue:控制灵活
示例:
let arr = [1, 2, 3];for (let i = 0; i arr[i] = arr[i] * 2; // 直接改 arr[0], arr[1], arr[2]
}
// arr → [2, 4, 6]
用 forEach + 索引参数(可行但需注意写法)
forEach 的回调函数第三个参数就是当前数组本身,配合第二个参数(索引)即可定位并修改:
立即学习“Java免费学习笔记(深入)”;
- ✅ 能改原数组,但必须显式使用
array[index] = ... - ⚠️ 错误写法:
item = newValue—— 这只是改了局部变量,不影响原数组
示例:
let arr = ['a', 'b', 'c'];arr.forEach((item, index, array) => {
array[index] = item.toUpperCase(); // ✅ 正确:通过 array 和 index 写回
}
// arr → ['A', 'B', 'C']
不推荐:map / filter / reduce 等方法
这些方法**返回新数组,不修改原数组**(纯函数特性)。即使你把结果赋值给原变量名,也只是替换引用,不是“修改”原数组对象本身:
- ❌
arr.map(...)不会改变arr,返回的是全新数组 - ⚠️ 若写
arr = arr.map(...),是让arr指向新数组,原数组若无其他引用会被回收
这不是“遍历中修改原数组”,而是“用新数组替代旧数组”——语义和内存行为都不同。
特殊情况:数组元素是对象或数组(引用类型)
如果原数组存的是对象,那么即使在 forEach 中只操作 item.xxx = ...,也能生效,因为 item 和 arr[i] 指向同一对象:
arr.forEach(item => item.n *= 10);
// arr → [{n: 10}, {n: 20}] —— ✅ 成立,因为修改的是对象属性
但注意:这改的是对象内部,不是替换数组里的元素本身(即没动 arr[0] 这个引用地址)。如果想把 arr[0] 整个换成另一个对象,仍需 arr[i] = newObj。


















