2013-04-05 19 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