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

JavaScript对象按引用传递的例外及代码示例疑问解析

JavaScript对象引用传递的“例外”:重新赋值函数参数的情况

嘿,这个问题问到点子上了!很多JS开发者都会被“对象按引用传递”的说法绕进去,其实咱们得先纠正一个核心误区:JS里所有参数都是按值传递的,只不过对象类型的“值”是指向内存中对象的引用。搞懂这个,两段代码的差异就一目了然了。

第一段代码:修改共享对象的内容

先看这段代码:

const sayMyName = wizard => { wizard.name = 'Shazam'; }
let boy = { name: 'Billy' };
sayMyName(boy);
console.log(boy.name); // 输出 'Shazam'

当你把boy传入函数时,函数的参数wizard拿到的是boy的引用副本——简单说就是,wizard和boy现在都指着内存里同一个{ name: 'Billy' }对象。所以你通过wizard.name = 'Shazam'修改属性时,其实是在修改那个共享的对象,外部的boy自然能看到这个变化,结果就变成了'Shazam'。

第二段代码:给参数重新赋值新对象

再看这段让人困惑的代码:

const sayMyName = wizard => { wizard = { name: 'Shazam' }; }
let boy = { name: 'Billy' };
sayMyName(boy);
console.log(boy.name); // 输出 'Billy'

这里的关键是wizard = { name: 'Shazam' }这行——它不是修改原来的对象,而是直接给wizard这个局部变量重新赋值了一个全新的对象引用。这时候wizard就不再指着原来和boy共享的那个对象了,它现在指向的是新创建的{ name: 'Shazam' }。而外部的boy从头到尾都没动过,还是指着原来的{ name: 'Billy' },所以输出自然还是原来的值。

总结:所谓“例外”其实是操作方式的差异

你觉得的“例外情况”,本质上是两种操作的区别:

  • 当你修改参数指向的对象的内容(比如改属性、调用方法):因为参数的引用副本和外部变量指向同一个对象,所以会影响外部对象
  • 当你直接给参数变量重新赋值(不管是新对象还是基本类型):参数的引用副本就和外部变量彻底断开了联系,不会对外部产生任何影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:15:54