2011-10-06 223 views
3

今天我在javascript中遇到了這個問題,不知道它爲什麼會發生。爲什麼在JavaScript中發生這種情況?

var a = { 
    prop: { 
     bool: true 
    } 
}; 

console.log(a.prop.bool); // logs true 
var b = a; 
b.prop.bool = false; 
console.log(a.prop.bool); // logs false ¿? 
+0

-1:你將它標記爲「參考」,所以你至少清楚地知道它的一些內容。在網上搜索「javascript變量參考」提供了很多解釋......所以這個問題並沒有顯示研究工作。 –

+1

對不起,我真的找了答案,但沒有找到像我一樣準確的答案。 – Datamosh

回答

5

表達式{ prop: ... }表達式被評估一次以創建一個對象。

ab都是參考到那個單一的對象。

參見What's the difference between passing by reference vs. passing by value?http://en.wikipedia.org/wiki/Reference_(computer_science)

參考文獻廣泛用於編程,特別是能夠有效地傳遞大的或可變的數據作爲參數的程序,或各種用途之間共享這些數據。

編輯

clone從下劃線不淺拷貝。

創建對象的淺拷貝克隆。任何嵌套對象或數組將被引用複製,而不是重複

要創建深層副本,最簡單的方法可能是序列化和反序列化。這會做奇怪的事情,如果a有參考週期雖然。

var b = JSON.parse(JSON.stringify(a)); 
+0

如何分配** b **等於** a **? – Datamosh

+0

@Datamosh,你想創建一個對象的副本嗎? –

+0

是的,我想複製。使用下劃線中的_.clone()給出了相同的結果:( – Datamosh

3
當你將b鍵,當B是一個更新的分配是按引用含義B內存爲使引用相同的位置和你觀察它看起來像一個也更新

5

您已創建對同一對象的引用。當你這樣做時,變量b的任何變化都會影響存儲在變量a中的對象。

您需要對該對象執行「克隆」以更改它,以便您有兩個對象,而不是一個帶有兩個引用的對象。

+3

請注意,沒有「對象b」和「對象a」,只有一個對象(並且它沒有姓名) –

+0

@ŠimeVidas很好,我已經解決了這個問題。 – FreeSnow

相關問題