Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript数组的浅拷贝和深拷贝之间有什么区别?_Javascript_Arrays - Fatal编程技术网

使用JavaScript数组的浅拷贝和深拷贝之间有什么区别?

使用JavaScript数组的浅拷贝和深拷贝之间有什么区别?,javascript,arrays,Javascript,Arrays,根据MDN文档,调用array.slice()将创建数组的浅层副本 看这个 但是,如果我在控制台中运行一个简单的测试: var test = [[1,2,3],7,8,9]; var shallow_copy = test.slice(); 我可以看到整个二维数组都被复制了 浅拷贝和深拷贝的区别是什么?如果我猜的话,我会称之为深度复制。要了解区别,请尝试: shallow_copy[0][2] = 4; console.dir(test); var dup = { a: orig.a, b:

根据MDN文档,调用
array.slice()
将创建数组的浅层副本

看这个

但是,如果我在控制台中运行一个简单的测试:

var test = [[1,2,3],7,8,9];
var shallow_copy = test.slice();
我可以看到整个二维数组都被复制了


浅拷贝和深拷贝的区别是什么?如果我猜的话,我会称之为深度复制。

要了解区别,请尝试:

shallow_copy[0][2] = 4;
console.dir(test);
var dup = { a: orig.a, b: orig.b, c: orig.c }; //Deep copy!
您将看到
test
已被修改!这是因为,虽然您可能已将值复制到新数组中,但嵌套数组仍然是相同的


深度副本将递归地执行浅层副本,直到所有内容都是原始副本的新副本。

基本上,您只是获得对原始变量/数组的引用。更改引用也将更改原始数组。您需要循环原始数组的值并形成一个副本

考虑这个例子:

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

,这不是一个浅拷贝。那根本不是副本。我可能错了,请随意更正!这是我从过去的经验中学到的。这只是传递参考,而不是肤浅或深刻的复制。请看下面的最佳答案:浅拷贝和深拷贝的区别。另外,您在示例中所称的“深度复制”实际上是一个浅复制。这意味着
test[0]==shallow\u copy[0]
,它们指的是同一个数组对象。我发现JavaScript文档中使用“shallow”和“deep”两个词完全令人困惑,因为已经说过对象永远不会被复制。当它显式读取“shall”时,我希望所有元素都是对同一事物的引用(包括数字等非对象),但它只适用于对象,这些对象已经声明永远不会被复制。感谢您的明确解释。我一直在寻找同样的东西