Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 Array.concat反映在concatation之后修改输入嵌套数组时结果数组中的更改_Javascript_Arrays - Fatal编程技术网

Javascript Array.concat反映在concatation之后修改输入嵌套数组时结果数组中的更改

Javascript Array.concat反映在concatation之后修改输入嵌套数组时结果数组中的更改,javascript,arrays,Javascript,Arrays,根据MDN,concat的描述如下: concat()方法用于合并两个或多个数组。这种方法 不更改现有数组,而是返回一个新数组 考虑下面的代码 例1 constarray1=[[a']、[b'、[c']; 常量数组2=['d','e','f']; 常量数组3=数组1.concat(数组2);//合并数组1和数组2并返回新数组3。 控制台日志(array3); 数组1.push(‘push’);//作为最后一个元素推送到阵列1 console.log(数组3);//数组3没有变化,看起来是正确的

根据MDN,concat的描述如下:

concat()方法用于合并两个或多个数组。这种方法 不更改现有数组,而是返回一个新数组

考虑下面的代码

例1

constarray1=[[a']、[b'、[c'];
常量数组2=['d','e','f'];
常量数组3=数组1.concat(数组2);//合并数组1和数组2并返回新数组3。
控制台日志(array3);
数组1.push(‘push’);//作为最后一个元素推送到阵列1

console.log(数组3);//数组3没有变化,看起来是正确的
索引
0
中的元素
array1
(a非原语)通过引用复制到
array1返回的新数组中。concat(array2)
并存储在
array3

.push()
在适当的位置变异数组。变异
array1
时,不会影响
array3
,因为它们不共享相同的引用(
concat
返回了一个新数组)

但是由于
array1
中索引
0
处的元素(a非原语)与
array3
中索引
0
处的元素共享相同的引用(您可以通过查看
array1[0]==array3[0];//true
)来检查该元素,在
array1
中对该数组进行变异就是在
array3
中对同一数组进行变异

TLDR:
array1!==数组3
array1[0]==array3[0]

我了解按值传递和按引用传递(以及数组和对象共享引用),但让我困惑的是,为什么嵌套数组共享引用而原始数组被复制

这就是工作原理,它返回新数组中相同元素的副本

您可以使用以下方法执行相同的操作:

我们有来自
array1
array2
的相同元素的副本,但是在一个新的数组中
[]
,因此如果元素是数组或对象,它将通过引用进行复制

看看这个例子:
constarray1=[[a']、[b'、[c'];
常数array3=array1.concat();
log('array3:',array3);
log('array3==array1?:',array3==array1);

console.log('array3[0]==array1[0]?:',array3[0]==array1[0])除了上面贴出的那些好答案之外,下面是一篇关于深度和浅层复制的有趣且解释得很好的文章


生成的数组不反映对输入的更改。然而,真正改变的是一个元素,即结果数组和输入的元素。
array.concat()
不会克隆它组合的元素,因此javascript数组/对象中的
array[0]===array3[0]
通过引用复制。这就是结果数组发生变化的原因。假设您有一个写在纸上的房屋地址列表。你告诉某人复制那个列表。现在你有两张纸质的住址清单。现在你把其中一栋楼夷为平地,把一张名单给一个人,另一张给另一个人,告诉两个人去检查房子。他们都会发现一座被夷为平地的房子,尽管列表(在纸上设置,未经编辑)从未更改。concat返回一个新的元素数组,但也不会创建每个元素的副本。知道
浅拷贝
深拷贝
之间的区别。谢谢你,我很抱歉,但我仍然试图理解为什么它会保留嵌套数组的引用而不是原始数组的引用,或者如果我是对的,为什么它要浅拷贝嵌套数组而深拷贝原始数组?@Tick20浅拷贝只会复制原始值(数字、布尔值、字符串),但只会复制复杂类型(对象、数组、承诺、函数等)的引用@Seblor,好的,但在我们处理这个问题时,两者都是数组,当引用嵌套数组时,主数组按值复制。
concat
创建浅层副本,仅复制嵌套数组的引用。
const array3 = [...array1, ...array2];