为何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
相关产品推荐
相关产品推荐

