为何无法通过该方式修改对象本身却能修改对象属性?
为什么无法在函数中替换原对象,但能修改对象属性?
你给出的代码执行后,console.log(obj.a)依然输出hello,核心原因是JavaScript的参数传递是按值传递——哪怕是对象类型,传递的也是引用的副本,而非引用本身。
具体拆解代码的执行流程:
- 第一步:
var obj = {a: "hello"}创建了一个对象,obj变量存储的是这个对象在内存中的引用地址。 - 调用
modify(obj)时,把obj里的引用地址复制了一份传给函数参数o,此时o和obj指向内存中同一个对象。 - 但函数内的
o = {a: "hello world"}是给参数o重新赋值了一个全新的对象引用,这时o就和外部的obj彻底断开了关联,它指向的是新创建的对象,自然不会影响原obj。
那为什么修改对象属性就能生效?如果把函数改成这样:
var obj = { a: "hello" }; function modify(o) { o.a = "hello world"; } modify(obj); console.log(obj.a); // 输出 "hello world"
这时候是通过o的引用,直接修改了它指向的内存对象的属性——因为o和obj指向同一个对象,所以外部obj的属性也会同步变化。本质是操作了同一个对象的内容,而非给参数变量重新赋值。
内容的提问来源于stack exchange,提问作者Maida Munir
相关产品推荐
相关产品推荐

