根据MDN文档,调用array.slice()
将创建数组的浅表副本。
请参阅此MDN link for slice()。
但是,如果我在控制台中运行一个简单的测试:
var test = [[1,2,3],7,8,9];
var shallow_copy = test.slice();
并检查shallow_copy,我可以看到整个二维数组似乎被复制了。
浅拷贝和深拷贝有什么区别?如果我猜的话,我会把它称为深层副本。
答案 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
。