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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:25:35