You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Array.forEach中数组赋值失效?常规for循环却可行?

为什么forEach循环无法实现预期的数组赋值效果,而常规for循环却能正常工作?

先看你给出的代码示例:

class Nums{
 numbs: number[];
 constructor(nums: number[]){
  this.nums = nums;
 }
}

const [nums1, nums2, nums3] = [new Nums([1]), new Nums([2]), new Nums([3])];
const numSet = [nums1.nums, nums2.nums, nums3.nums];
const magicNums = [5,5,5];

//无法得到正确结果。
numSet.forEach((nums) => {
 nums = magicNums;
});

console.log(nums1.nums); // [1]

//可以得到正确结果。
for(let i=0; i < numSet.length; i++){ // 注:原代码循环条件存在笔误,已修正
 numSet[i] = magicNums;
}

console.log(nums1.nums); // [5,5,5]

核心区别在于两者的操作对象不同

  • forEach循环为啥没用?
    forEach回调里的nums是numSet数组对应元素的局部副本变量。哪怕原元素是数组这种引用类型,JS传递的也是引用的"副本"——简单说就是,nums只是暂时拿着和原元素一样的地址,但它本身是个独立的局部变量。你给nums = magicNums,只是把这个局部变量的指向改成了magicNums,根本没碰numSet数组里的原元素,所以原数组自然没变化。

  • 常规for循环为啥有效?
    你通过numSet[i]直接访问数组的索引位置,这是在直接操作numSet数组本身的元素。执行numSet[i] = magicNums时,是把numSet数组第i位的元素直接替换成magicNums的引用,原数组实实在在被修改了,后续自然能看到变化。

要是想用forEach实现同样效果怎么办?

可以利用forEach回调的第二个参数(索引),直接操作原数组的对应位置:

numSet.forEach((_, index) => {
  numSet[index] = magicNums;
});

内容的提问来源于stack exchange,提问作者MasterJoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:25:31