7

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

不使用 concat 方法添加两个数组

我按照上面的建议使用了 push.apply() 方法,但是有人可以向我解释一下,如果将数组作为参考发送到函数中,为什么我不能使用 concat() 来合并两个数组?

4

3 回答 3

10

参考MDN上的Array.concat :

对新数组的任何操作都不会影响原始数组,反之亦然。

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

于 2013-05-21T21:19:35.073 回答
9

如果你使用concat原始数组将是未修改的。如果您对它有参考,您将不会看到新元素。

var arr1 = [ "a", "b" ];
var arr2 = [ "c", "d" ];
arr1.push.apply(arr1, arr2);

基本上这样做:

[ "a", "b" ].push("c", "d");

apply将数组转换为参数列表。顺便说一下, to 的第一个参数applycontextarr1在这种情况下,因为您希望推送适用于arr1.

您可以使用concat

var arr1 = [ "a", "b" ];
var arr2 = [ "c", "d" ];
var arr3 = arr1.concat(arr2);

这使原件保持arr1原样。您已经创建了一个新数组,其中包含arr1arr2元素。如果您有对原件的引用,arr1它将是未经修改的。这可能是不想使用concat.

于 2013-05-21T21:17:07.903 回答
1

假设我们有 2 个数组“a”和“b”。Array.concat方法将返回Array"c"的新实例,它表示 a 和 b 之间的连接,没有 a 或 b 的任何突变Array.push 返回推送元素和变异this实例的最后一个索引。

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

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] 
于 2018-07-16T07:36:17.893 回答