通过引用复制

时间:2015-11-28 18:34:46

标签: javascript

据我所知,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的参考)不起作用。请提供一个洞察力,告诉我我错过了什么。我的假设是非常愚蠢还是有些我不知道的事情?

2 个答案:

答案 0 :(得分:6)

不复制对象,但复制了对象引用。引用本身就是值。

因此,当您编写m = b.obj时,m直接指向对象1,2,3。 m不是对b.obj的引用,而是(顺便提及)与b.obj作为参考的同一对象的引用。
因此mb.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
    }
};