在JS中,为什么slice()文档说它看起来像深拷贝时是浅拷贝?

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)

T.J*_*der 5

它正在做一个浅薄的副本.但是浅拷贝中的值指向原始数组/对象,因为它们是对象引用.

所以我们说:

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]),我们都会看到修改.