JavaScript 数组的浅拷贝和深拷贝有什么区别?

IT技术 javascript arrays
2021-02-25 01:26:13

根据 MDN 文档调用array.slice()将创建数组的浅拷贝。

有关slice() ,请参阅此MDN 链接

但是,如果我在控制台中运行一个简单的测试:

var test = [[1,2,3],7,8,9];
var shallow_copy = test.slice();

并检查shallow_copy,我可以看到整个二维数组似乎被复制了。

浅拷贝和深拷贝有什么区别?如果我猜的话,我会称其为深拷贝。

2个回答

要查看差异,请尝试:

shallow_copy[0][2] = 4;
console.dir(test);

你会看到test已经修改了!这是因为虽然您可能已将值复制到新数组中,但嵌套数组仍然是相同的。

深拷贝将递归地执行浅拷贝,直到所有内容都是原始副本的新副本。

感谢您的清晰解释。我在很长一段时间内一直在寻找相同的东西
2021-05-16 01:26:13

基本上,您只是获得对原始变量/数组的引用。更改引用也会更改原始数组。您需要遍历原始数组的值并形成副本。

考虑这个例子:

var orig = {  a: 'A', b: 'B', c: 'C' };

假设您要创建此副本的副本,以便即使更改原始值,也始终可以返回到原始值。

我可以做这个:

var dup = orig; //Shallow copy!

如果我们改变一个值:

dup.a = 'Apple';

此语句也a将从更改orig,因为我们有一个浅拷贝,或对 var 的引用orig这意味着,您也会丢失原始数据。

但是,通过使用原始orig变量的属性创建一个全新的变量,您可以创建一个深层副本。

var dup = { a: orig.a, b: orig.b, c: orig.c }; //Deep copy!

现在如果你改变dup.a,它只会影响dup而不是orig

这只是传递引用而不是浅拷贝或深拷贝。查看最佳答案:stackoverflow.com/questions/184710/...浅拷贝和深拷贝的区别。另外你在你的例子中所说的“深拷贝”实际上是一个浅拷贝
2021-04-28 01:26:13
那不是浅拷贝。那根本就不是副本。
2021-04-29 01:26:13
可能有误,欢迎指正!这是我从一个旧经验中学到的。
2021-05-03 01:26:13