在JavaScript数组中,浅拷贝和深拷贝有什么区别?
在JavaScript数组中,浅拷贝和深拷贝有什么区别?
根据MDN文档,调用array.slice()
将创建一个数组的浅拷贝。
请参阅此MDN链接以了解slice()的更多信息。
然而,如果我在控制台中运行一个简单的测试:
var test = [[1,2,3],7,8,9]; var shallow_copy = test.slice();
并检查shallow_copy,我可以看到整个二维数组似乎被复制了过来。
浅拷贝和深拷贝有什么区别?如果我要猜的话,我会将其称为深拷贝。
浅拷贝和深拷贝是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/…上的最佳答案,了解浅拷贝和深拷贝的区别。此外,你在例子中提到的"深拷贝"实际上是一个浅拷贝。