为什么可以';我能在JavaScript中定义一个数组引用吗?

为什么可以';我能在JavaScript中定义一个数组引用吗?,javascript,arrays,concat,Javascript,Arrays,Concat,我有两个数组,一个作为函数的引用(参数),另一个作为函数的一部分创建-与这里描述的场景完全相同: 根据上面的建议,我使用了push.apply()方法,但是有人能给我解释一下,如果数组作为引用发送到函数中,为什么我不能使用concat()合并两个数组?如果使用concat原始数组将不会被修改。如果你参考了它,你就看不到新元素了 var arr1 = [ "a", "b" ]; var arr2 = [ "c", "d" ]; arr1.push.apply(arr1, arr2); 基本上是

我有两个数组,一个作为函数的引用(参数),另一个作为函数的一部分创建-与这里描述的场景完全相同:


根据上面的建议,我使用了push.apply()方法,但是有人能给我解释一下,如果数组作为引用发送到函数中,为什么我不能使用concat()合并两个数组?

如果使用
concat
原始数组将不会被修改。如果你参考了它,你就看不到新元素了

var arr1 = [ "a", "b" ];
var arr2 = [ "c", "d" ];
arr1.push.apply(arr1, arr2);
基本上是这样的:

[ "a", "b" ].push("c", "d");
apply
将数组转换为参数列表。
apply
的第一个参数是
context
,顺便说一句,在本例中是
arr1
,因为您希望推送应用于
arr1

您可以使用
concat

var arr1 = [ "a", "b" ];
var arr2 = [ "c", "d" ];
var arr3 = arr1.concat(arr2);
这将保留原来的
arr1
。您已经创建了一个新数组,其中包含
arr1
arr2
元素。如果您有对原始
arr1
的引用,它将不会被修改。这可能是不想使用concat的原因。请参阅MDN上的:

对新阵列的任何操作都不会对原始阵列产生影响,反之亦然


这使得它的行为不同于将改变原始数组对象的
Array.push.apply
,必须使用
Array.concat
的返回值。否则,它将按照上面MDN链接中的说明工作。

假设我们有两个数组“a”和“b”
Array.concat
方法将返回
Array
“c”的新实例,该实例表示a和b之间的连接,而a或b不发生任何突变
Array.push
返回被推元素的最后一个索引,并对该实例进行变异。

由于ES6(或15,不确定)可以解包参数,也可以使用push来连接(没有有害代码)


看看这个链接。不管我做什么,它与另一页上显示的完全相同。它还声明“对象引用(而不是实际对象):concat将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。也就是说,如果修改了引用的对象,则新数组和原始数组都可以看到更改。“@Tamas这是指数组中的对象,而不是数组本身-但是,是的,我不能接受两个答案,但这也很有帮助,谢谢!这是需要Array.prototype还是只需要一个数组就可以完成?谢谢,这非常有用!
a = [1,2,3,4]; // a=[1,2,3,4];
b = [5,6,7,8]; // b=[5,6,7,8]; 
a.push(...b)   // a=[1,2,3,4,5,6,7,8]; b=[5,6,7,8]