在JavaScript数组中,浅拷贝和深拷贝有什么区别?

29 浏览
0 Comments

在JavaScript数组中,浅拷贝和深拷贝有什么区别?

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

请参阅此MDN链接以了解slice()的更多信息。

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

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

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

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

0
0 Comments

深拷贝和浅拷贝是在JavaScript数组中常见的两个概念。浅拷贝只是复制了数组的值,但是嵌套数组仍然是同一个引用。而深拷贝则会递归地复制所有的值,直到所有的嵌套数组都是原始数组的副本。

为了更好地理解这两者的区别,可以尝试以下代码:

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

你会发现,test数组被修改了!这是因为虽然你将值复制到了新数组中,但是嵌套数组仍然是同一个引用。

如果想要实现深拷贝,可以使用递归来进行浅拷贝,直到所有的嵌套数组都是原始数组的副本。

感谢这位网友清晰的解释,我很久以来一直在寻找这个答案。

0
0 Comments

浅拷贝和深拷贝是JavaScript数组中常见的两种拷贝方式。浅拷贝只是获取原变量/数组的一个引用,改变引用也会改变原数组。要创建一个副本,需要遍历原数组的值并形成一个副本。深拷贝是通过使用原始变量的属性创建一个全新的变量来创建的。通过这种方式,即使更改原始值,也可以始终返回到原始状态。

举个例子,假设有一个原始对象orig:

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

如果我们想创建一个副本,使得即使更改原始值,也可以返回到原始状态,可以这样做:

var dup = orig; //浅拷贝!

如果我们更改一个值:

dup.a = 'Apple';

这个语句也会改变orig的a值,因为我们只是进行了浅拷贝,或者说是原变量orig的引用。这意味着,你也会丢失原始数据。

但是,通过使用原始变量orig的属性创建一个全新的变量,你可以创建一个深拷贝:

var dup = { a: orig.a, b: orig.b, c: orig.c }; //深拷贝!

现在,如果你改变dup.a的值,只会影响到dup,而不会影响到orig。

这并不是浅拷贝,甚至不是拷贝。

我可能是错的,请随时纠正!这是我从以前的经验中学到的。

这只是传递引用而不是浅拷贝或深拷贝。请查看stackoverflow.com/questions/184710/…上的最佳答案,了解浅拷贝和深拷贝的区别。此外,你在例子中提到的"深拷贝"实际上是一个浅拷贝。

0