根据文档Array.prototype.slice()在 JavaScript 中,slice()
方法将数组的一部分的浅拷贝返回到新数组中。据我了解,浅复制只会复制数组中的顶级元素,而不会复制嵌套元素。但是,当我在浏览器控制台中运行测试时,它看起来确实像slice()
方法实际上是复制嵌套元素(深复制)。
我在哪里误解了深拷贝的概念?请帮助我澄清,因为它与我的确切示例有关。
var array = [1,2,[3,4,[5,6]]];
var array2 = array.slice();
它正在做一个浅拷贝。但是该浅拷贝中的值指向原始数组/对象,因为它们是对象引用。
假设我们有:
var orig = [ [1] ];
在记忆中我们有:
+−−−−−−−−−−−−−+
[orig:Ref22157]−−−−>| (array) |
+−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+
| 0: Ref84572 |−−−−−−−>| (array) |
+−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+
| 0: 1 |
+−−−−−−−−−−−−−+
现在我们做:
var copy = orig.slice();
并有:
+−−−−−−−−−−−−−+
[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]);
请注意,当我们修改嵌套数组的状态时,无论我们采取哪种途径来获取它,我们都会看到该修改(orig[0][0]
or copy[0][0]
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)