zec*_*ude 1 javascript arrays deep-copy
根据Array.prototype.slice()JavaScript中的文档,该slice()方法将数组的一部分的浅表副本返回到新数组中.据我所知,浅拷贝只会复制数组中的顶级元素,不会复制嵌套元素.但是,当我在浏览器控制台中运行测试时,确实看起来该slice()方法实际上是复制嵌套元素(深度复制).
我在哪里误解了深拷贝的概念?请帮我澄清,因为它与我的确切例子有关.
var array = [1,2,[3,4,[5,6]]];
var array2 = array.slice();
Run Code Online (Sandbox Code Playgroud)
它正在做一个浅薄的副本.但是浅拷贝中的值指向原始数组/对象,因为它们是对象引用.
所以我们说:
var orig = [ [1] ];
Run Code Online (Sandbox Code Playgroud)
在记忆中我们有:
+?????????????+
[orig:Ref22157]????>| (array) |
+?????????????+ +?????????????+
| 0: Ref84572 |???????>| (array) |
+?????????????+ +?????????????+
| 0: 1 |
+?????????????+
现在我们做:
var copy = orig.slice();
Run Code Online (Sandbox Code Playgroud)
并有:
+?????????????+
[orig:Ref22157]????>| (array) |
+?????????????+
| 0: Ref84572 |???+
+?????????????+ |
|
| +?????????????+
+???>| (array) |
+?????????????+ | +?????????????+
[copy:Ref54682]????>| (array) | | | 0: 1 |
+?????????????+ | +?????????????+
| 0: Ref84572 |???+
+?????????????+
请注意如何复制对嵌套数组的引用(此处在概念上显示为"Ref84572",但我们从未看到对象引用的实际值),但仍引用相同的嵌套数组.
这里证明它很浅:
var orig = [ [1] ];
var copy = orig.slice();
console.log("orig[0][0] = " + orig[0][0]);
console.log("copy[0][0] = " + copy[0][0]);
console.log("Setting copy[0][0] to 2");
copy[0][0] = 2;
console.log("orig[0][0] = " + orig[0][0]);
console.log("copy[0][0] = " + copy[0][0]);Run Code Online (Sandbox Code Playgroud)
请注意,当我们修改嵌套数组的状态时,无论我们采用哪条路径(orig[0][0]或copy[0][0]),我们都会看到修改.