据我所知,JavaScript中的对象是通过引用而不是值复制的。但是我写的下面的代码没有按预期工作。也许我不知道正确的行为。请提供见解和可能的解决方案,以避免这种情况。
我的代码:
var a = {
obj:{u:1,v:2,w:3},
setobj:function(objj){
this.obj = objj
}
};
var b = a;
var m = b.obj
console.log(m);
打印 - {u:1,v:2,w:3}
,
然后 -
var c = a;
c.setobj({x:4,y:5});
console.log(c.obj); //prints {x:4,y:5}
console.log(a.obj); //prints {x:4,y:5}
console.log(b.obj); //prints {x:4,y:5}
但:
console.log(m); //prints {u:1,v:2,w:3}
我期待m包含b.obj的引用,其中b包含a的引用。后者正在工作,但前者(m的参考)不起作用。请提供一个洞察力,告诉我我错过了什么。我的假设是非常愚蠢还是有些我不知道的事情?
答案 0 :(得分:6)
不复制对象,但复制了对象的引用。引用本身就是值。
因此,当您编写m = b.obj
时,m
将直接指向对象1,2,3。 m
不是对b.obj
的引用,而是(顺便提及)与b.obj
作为参考的同一对象的引用。
因此m
和b.obj
都是(现在不相关)对同一对象1,2,3的引用。
然后,当您覆盖b.obj
时,该引用会更改为对象4,5,但m
仍然是对原始对象的引用。
答案 1 :(得分:2)
{u:1,v:2,w:3}
是一个独立的对象,并有其参考地址。
当您指定obj:{u:1,v:2,w:3}
时
,obj
引用地址等于
{u:1,v:2,w:3}地址。
当您执行c.setobj({x:4,y:5});
时,新地址将被分配到obj
。
您的代码等于:
var anotherObject= {u:1,v:2,w:3}
var a = {
obj:anotherObject,
setobj:function(objj){
this.obj = objj
}
};