我有一个“空”数组,稍后会在代码中填充数据。但是在它到达那个阶段之前,有一个部分将默认内容复制到临时数组,因此可以更改原始内容,然后接收存储在副本中的相关数据。
问题是当我使用切片并删除原始数组中的部分时,临时数据也会受到影响。
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:
我可以使用变通方法分别复制数组的每个部分而不是一次复制,但我仍然想了解为什么会这样。
答案 0 :(得分:1)
取自here:
对于对象引用(而不是实际对象),slice复制对象 引用到新数组中。原始阵列和新阵列都参考 对同一个对象。如果引用的对象发生更改,则更改为 对新的和原始数组都可见。
我的猜测是,因为你的数组包含数组数组,所以它们可能被表示为对象引用;因此,slice
正在复制引用,而不是对象。它只做浅拷贝,而不是深拷贝。如果数组中的项不是对象,则不会遇到此问题。
答案 1 :(得分:1)
这是预期的行为。看看documentation。 您只能获得原始数组的浅副本:
slice()方法将数组的一部分的浅表副本返回到新的数组对象中。
对于数组,存储对象引用,因此只复制引用。对于String,您将不会观察到此行为。
对于对象引用(而不是实际对象),slice将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。如果引用的对象发生更改,则更改对新的和原始数组都可见。
对于字符串和数字(不是String和Number对象),slice将字符串和数字复制到新数组中。对一个数组中的字符串或数字的更改不会影响另一个数组。