JS数组传参疑问:为何修改方法影响原数组,赋值新数组却不生效?
为什么给函数里的数组参数赋值新值不会修改原数组?
我懂你这种困惑——明明push、修改数组下标能改动原数组,怎么直接给函数里的数组参数赋值新数组就完全没影响?其实核心是你对JavaScript里的「传引用」理解有点偏差,咱们结合你的代码一步步掰扯清楚:
先明确一个关键:JavaScript里对象(包括数组)的传参是共享传递(常被通俗说成“传引用”,但严格来说不是传统意义上的传引用),简单说就是函数参数拿到的是原数组的「引用副本」——这个副本和原变量指向同一个内存里的数组,但它本身是函数内部的局部变量。
咱们拆解你的示例代码看:
const modify = (someArray) => { // 修改了原数组 someArray.push(1) // 修改了原数组 someArray[0] = 'A' // 未修改原数组,原因在这 someArray = ['whatever'] } let myArray = ['a', 'b'] modify(myArray) console.log(myArray) // 输出 ["A", "b", 1]
1. someArray.push(1) 和 someArray[0] = 'A' 为什么能改原数组?
这两步里,someArray这个局部变量拿着的是原数组myArray的引用副本——就像你和我各有一把能打开同一个柜子的钥匙。你用钥匙打开柜子,往里面加了东西(push),或者把柜子里第一个东西换成别的(someArray[0] = 'A'),我打开柜子自然能看到变化,因为咱们操作的是同一个柜子(内存里的原数组)。
2. someArray = ['whatever'] 为什么没影响原数组?
这一步你是直接给someArray这个函数内部的局部变量重新赋值了一个全新的数组。相当于你把手里的柜子钥匙扔了,换了一把能打开新柜子的钥匙——这时候你手里的钥匙和我的钥匙已经没关系了,你折腾新柜子的东西,完全不会影响原来的那个柜子(原数组myArray)。
总结一下核心区别:
- 当你调用数组方法(
push、splice)或者直接修改下标时,是通过引用操作原对象的内容,所以原数组会跟着变; - 当你给参数变量直接赋值新值时,是改变了参数变量自身的引用指向,和原数组彻底断开了联系,原数组自然不受影响。
内容的提问来源于stack exchange,提问作者JS Lover
相关产品推荐
相关产品推荐

