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

