2015-11-28 123 views
1

據我所知,JavaScript中的對象是通過引用而不是值來複制的。但是我寫的下面的代碼並沒有像預期的那樣工作。也許我不知道正確的行爲。請提供見解和可能的解決方案,以避免這種情況。複製參考

我的代碼:

​​

它打印 - {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} 

我期待米到包含參考b.obj,其中b包含a的引用。後者正在工作,但前者(米的參考)不起作用。請提供一個洞察力,並告訴我我錯過了什麼。這是我的非常愚蠢的假設還是有我不知道的東西?

+0

是的,你的假設是錯誤的。 m是對存儲在b.obj中的對象的引用。你以後重寫了這個參考,但它不會神奇地讓m指向一個新的對象。另外,「通過參考複製」並沒有多大意義。 – flq

回答

6

該對象不被複制,但參考到對象複製。引用本身就是值。

所以,當你寫m = b.obj,m直接到對象1,2,3。 m不是對b.obj的引用,而是提及(偶然地)與b.obj作爲參考的同一對象。
因此,mb.obj都是(現在不相關的)對同一個對象1,2,3的引用。

然後,當您覆蓋b.obj時,該引用將更改爲對象4,5,但m仍然是對原始對象的引用。

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 
    } 
};