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

为何JavaScript对象按引用传参后obj1.a仍为1而非7?

为什么修改函数内的对象引用后,原对象属性没变化?

已知JavaScript对象是按引用传递的,但执行下方代码后,console.log(obj1.a)的输出结果为1而非7,明明函数内已将值修改为7,这是为什么?

obj1 = {
    a: 1
}
obj2 = {
    a: 1
}

function c(d) {
    console.log('d bef ', typeof d)
    
    if (typeof d === 'object'){
         
        d = obj2
        obj2.a = 7
        console.log ('d.a', d.a)
    }
    
}
c(obj1)
console.log(obj1.a)

问题核心原因

首先要纠正一个常见误区:JavaScript里的对象并不是严格意义上的「按引用传递」,而是「按引用值传递」(也叫按共享传递)。具体到这段代码,关键在于函数内的d = obj2操作:

  • 调用c(obj1)时,参数d会拿到obj1的引用副本——此时d和obj1指向内存中同一个对象。
  • 但当执行d = obj2时,你是把d这个变量的引用指向改成了obj2,相当于给d重新分配了一个新的引用值,和原来的obj1彻底切断了关联。
  • 后续修改obj2.a = 7,只是改变了obj2指向的对象的属性,obj1指向的原始对象自始至终都没被修改过,所以外部打印obj1.a自然还是1。

验证对比

如果把函数内的逻辑改成直接修改d指向的对象属性,而不是重新赋值d,结果就会不一样:

function c(d) {
    if (typeof d === 'object'){
        d.a = 7 // 直接修改d指向的对象属性
        console.log ('d.a', d.a)
    }
}
c(obj1)
console.log(obj1.a) // 此时输出7

这是因为d还保持着和obj1相同的对象引用,修改的是对象本身的属性,所以原对象obj1的属性会同步变化。

内容的提问来源于stack exchange,提问作者Muhammad Shafaat Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:15:34