forEach不能修改数组长度或替换元素,但可修改引用类型元素的属性;对参数重新赋值无效,需通过索引赋值;禁用pop/push/splice等改变数组结构的操作。

forEach 本身不能直接修改原数组的长度或结构,但它可以修改原数组中元素的值(前提是这些元素是引用类型)。
forEach 可以修改对象元素的属性
当数组中存放的是对象、数组等引用类型时,forEach 回调函数内可以通过变量直接修改其属性,原数组中的对象会被同步更新:
const arr = [{ name: 'a' }, { name: 'b' }];
arr.forEach(item => {
item.name = item.name.toUpperCase(); // ✅ 修改对象属性
});
console.log(arr); // [{ name: 'A' }, { name: 'B' }]
forEach 无法替换数组中的元素本身
在 forEach 中对参数重新赋值,不会影响原数组(因为形参只是引用的副本,不是数组槽位的绑定):
const arr = [1, 2, 3];
arr.forEach((item, index) => {
item = item * 2; // ❌ 不会影响 arr[index]
arr[index] = item * 2; // ✅ 这样才可以
});
如果想批量改值,更推荐用 map 或直接 for 循环
语义更清晰、意图更明确:
- 用 map:生成新数组(推荐用于纯函数式场景)
- 用 for 或 for...of:直接通过索引或引用修改原数组(更直观可控)
- 用 forEach + 索引赋值:可行但略显绕,不推荐作为首选
注意:forEach 无法删除/添加元素
调用 arr.pop()、arr.push()、arr.splice() 等方法虽能改变原数组,但会干扰 forEach 的遍历行为(如跳过元素、重复遍历),属于危险操作,应避免。


















