复制数组时slice()的奇怪问题

时间:2014-02-06 13:40:30

标签: javascript arrays multidimensional-array slice

我有一个“空”数组,稍后会在代码中填充数据。但是在它到达那个阶段之前,有一个部分将默认内容复制到临时数组,因此可以更改原始内容,然后接收存储在副本中的相关数据。

问题是当我使用切片并删除原始数组中的部分时,临时数据也会受到影响。

var array1 = [["text", [[[1,2],[3,4],[5,6]]], 0]];
var array2 = array1[0].slice(0);

//alert(array2[1][0]) // Output: 1,2,3,4,5,6
array1[0][1][0] = new Array();
//alert(array2[1][0]) // Output:

http://jsfiddle.net/Mbv6j/4/

我可以使用变通方法分别复制数组的每个部分而不是一次复制,但我仍然想了解为什么会这样。

2 个答案:

答案 0 :(得分:1)

取自here

  

对于对象引用(而不是实际对象),slice复制对象   引用到新数组中。原始阵列和新阵列都参考   对同一个对象。如果引用的对象发生更改,则更改为   对新的和原始数组都可见。

我的猜测是,因为你的数组包含数组数组,所以它们可能被表示为对象引用;因此,slice正在复制引用,而不是对象。它只做浅拷贝,而不是深拷贝。如果数组中的项不是对象,则不会遇到此问题。

答案 1 :(得分:1)

这是预期的行为。看看documentation。 您只能获得原始数组的副本:

  

slice()方法将数组的一部分的浅表副本返回到新的数组对象中。

对于数组,存储对象引用,因此只复制引用。对于String,您将不会观察到此行为。

  

对于对象引用(而不是实际对象),slice将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。如果引用的对象发生更改,则更改对新的和原始数组都可见。

     

对于字符串和数字(​​不是String和Number对象),slice将字符串和数字复制到新数组中。对一个数组中的字符串或数字的更改不会影响另一个数组。