2014-06-24 90 views
0

我有对象的数组作为JavaScript数组按值传递不工作

var obj = {'name': 'John'}; 
var obj2 = {'name': 'Sam'}; 
var arr = []; 
arr.push(obj); 
arr.push(obj2); 

现在我创建一个新的数组arr2作为

arr2 = arr.slice(); 

现在,如果我改变arr2[0]['name'] = 'David';

然后arr1[0]['name']也变成'David';

arr2对象值更改时,我们如何防止arr的任何对象值发生更改。

+3

您正在克隆数组,但不是对象;他们仍然是参考。 – elclanrs

+0

有没有一种方法可以防止物体发生变化?什么是更好的方法 – user544079

+1

您正在寻找** deep **克隆/复制:http://stackoverflow.com/search?q=%5Bjavascript%5D+array+deep+copy,https://www.google .com/search?q = javascript%20deep%20copy –

回答

1

你必须克隆每个对象,不只是数组:

function cloneObject(obj) { 
    var result = {}; 

    for (var k in obj) { 
     if (Object.prototype.hasOwnProperty.call(obj, k)) { 
      result[k] = obj[k]; 
     } 
    } 

    return result; 
} 

var arr2 = arr.map(cloneObject); 

有没有我们可以防止对象更改的方法吗?

是的,有Object.freeze

arr.forEach(Object.freeze); 
+0

为什么不只是'if(obj.hasOwnProperty(k))'? – elclanrs

+0

@elclanrs:这只是为了将用户输入用作字典的键;他们可以键入'hasOwnProperty'并打破一切。它通常不需要担心,但效用函数应该是健壮的,毕竟=) – Ryan

0

当你复制你只在阵列中复制该数组,但这些值是对对象的引用。您最终得到两个单独的数组,但引用了相同的对象。

你需要做一个深拷贝,即在每一级的所有内容复制:

var arr2 = JSON.parse(JSON.stringify(arr)); 

现在你有数组中有一个完全独立的副本,应有尽有。