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

时间:2014-07-01 14:25:30

标签: javascript arrays

根据MDN文档,调用array.slice()将创建数组的浅表副本。

请参阅此MDN link for slice()

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

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

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

浅拷贝和深拷贝有什么区别?如果我猜的话,我会把它称为深层副本。

2 个答案:

答案 0 :(得分:23)

要查看差异,请尝试:

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

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

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

答案 1 :(得分:1)

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

考虑这个例子:

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