【问题标题】:Deep copy using spread operator doesn't work使用扩展运算符的深层复制不起作用
【发布时间】:2016-07-30 22:27:29
【问题描述】:

在通过将数组复制到另一个数组的方法时,我遇到了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 也发生了更改。如果深拷贝意味着为新数组分配了新内存,这怎么可能?

【问题讨论】:

标签: javascript deep-copy


【解决方案1】:

在你的例子中你做了:

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 一样序列化/反序列化。

【讨论】:

  • 这是否意味着扩展运算符不进行深度复制。这是否意味着文档有误?
  • @snow 我不能说错。标题可能有点误导,我认为需要更多解释
  • @snow:是的,MDN 错了。不要相信那里的一切——它只是一个维基。我现在已经修好了。
  • @Bergi 我现在看到了。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多