根据MDN文档,调用array.slice()
将创建数组的浅拷贝。
请参阅此MDN link for slice()。
但是,如果我在控制台中运行一个简单的测试:
var test = [[1,2,3],7,8,9];
var shallow_copy = test.slice();
检查shallow_copy,我可以看到整个二维数组似乎都被复制了。
浅拷贝和深拷贝有什么区别?如果我猜的话,我会说这是一个深度拷贝。
发布于 2014-07-01 22:27:57
要查看不同之处,请尝试:
shallow_copy[0][2] = 4;
console.dir(test);
您将看到test
已被修改!这是因为虽然您可能已经将值复制到新数组中,但嵌套的数组仍然是同一个数组。
深层副本将递归地执行浅层副本,直到所有内容都是原始副本的新副本。
发布于 2014-07-01 22:41:47
基本上,您只是获得了对原始变量/数组的引用。更改引用也会更改原始数组。您需要遍历原始数组的值并形成一个副本。
考虑这个例子:
var orig = { a: 'A', b: 'B', c: 'C' };
假设您想创建一个副本,这样即使您更改了原始值,也可以始终返回到原始值。
我可以这样做:
var dup = orig; //Shallow copy!
如果我们改变一个值:
dup.a = 'Apple';
此语句还将从orig
更改a
,因为我们有一个浅拷贝,或对var orig
的引用。这意味着,您还会丢失原始数据。
但是,通过使用原始orig
变量中的属性创建一个全新的变量,您可以创建一个深度副本。
var dup = { a: orig.a, b: orig.b, c: orig.c }; //Deep copy!
现在,如果您更改dup.a
,它只会影响dup
,而不会影响orig
。
https://stackoverflow.com/questions/24512712
复制相似问题