使用spread运算符的深层复制不起作用

时间:2016-07-30 22:27:29

标签: javascript deep-copy

在尝试将数组复制到另一个数组的过程中,我遇到了spread operator的文档,其中提到了:

  

深度复制数组

var arr = [1,2,3];
var arr2 = [...arr];
arr2.push(4); // 'arr2' becomes [1,2,3,4]; 'arr' stays unaffected

在我的experiments中,我使用了这种方法,并尝试将array1复制到array2中。但是,当我更改array1时,array2也被更改了。如果深度拷贝意味着新阵列被分配了新的内存,这怎么可能?

1 个答案:

答案 0 :(得分:0)

在您的示例中

array1 = [[1,2], [4]];
array2 = [...array1];
array3 = array1.slice();
array4 = JSON.parse(JSON.stringify(array1));
array1[0][1] = 3;
console.log(array1);
console.log(array2); // changed array1, changes reflected in array2 deep copy where art' though?

显然,当您执行array1[0][1] = 3;时,更改会影响两个数组,因为扩展运算符仅复制对原始数组元素的引用。 像执行array2 = [...array1];一样array2 = [array1[0], array1[1]];,所以数组元素指向相同的内存位置。

如果您需要深层复制,则需要像使用JSON.stringify一样序列化/反序列化。