2013-04-05 20 views
1

爲什麼b.first [0]返回「t」,我該如何避免這種情況?對象JavaScript中的奇怪行爲數組

我需要安全的「Q」在b.first [0]

var extend = function(o,p){ 
    for(prop in p){ 
     o[prop] = p[prop]; 
    } 
    return o; 
}; 

var a = {first:['q','w']}; 
var b = {}; 

extend(b,a); 

document.write(a.first[0]); //q 
document.write(b.first[0]); //q 

a.first[0] = 't'; 

document.write(a.first[0]); // t 
document.write(b.first[0]); // t ????????????????????? 
+0

因爲'a.first'是對數組的引用。當分配'b.first = a.first'(這就是* extend *似乎要做的事情)時,'b'獲得對同一個數組的引用。 – RobG 2013-04-05 05:57:07

+0

你需要**對象的深**拷貝。 http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-a-javascript-object/122704#122704 – HerrSerker 2013-04-05 06:02:36

+0

在我使用一些deepExtend的真實的,但似乎我的版本不好。我會嘗試其他版本。謝謝! – Aleksey 2013-04-05 06:35:43

回答

5

這是與通過一個延伸的B不重新從一個數據中的概念的一個問題。如果某些數據是一個對象(就像一個數組),它只是「指向」該數組,而不是創建一個新的,相同的數組。基本上你要存儲兩個指向同一個數組的指針,所以當你改變一個指針時,你改變了另一個指針。

下面是一個答案,更詳細地討論了「克隆」Javascript中的對象的想法。

https://stackoverflow.com/a/728694/1570248