我有两个数组,一个来自函数的引用(参数),另一个是作为函数的一部分创建的 - 与此处描述的场景完全相同:
我按照上面的建议使用了 push.apply() 方法,但是有人可以向我解释一下,如果将数组作为参考发送到函数中,为什么我不能使用 concat() 来合并两个数组?
我有两个数组,一个来自函数的引用(参数),另一个是作为函数的一部分创建的 - 与此处描述的场景完全相同:
我按照上面的建议使用了 push.apply() 方法,但是有人可以向我解释一下,如果将数组作为参考发送到函数中,为什么我不能使用 concat() 来合并两个数组?
参考MDN上的Array.concat :
对新数组的任何操作都不会影响原始数组,反之亦然。
这使得它的行为不同于将改变原始Array 对象的行为 -必须使用的返回值。否则,它会按照上面 MDN 链接中的说明工作。Array.push.apply
Array.concat
如果你使用concat
原始数组将是未修改的。如果您对它有参考,您将不会看到新元素。
var arr1 = [ "a", "b" ];
var arr2 = [ "c", "d" ];
arr1.push.apply(arr1, arr2);
基本上这样做:
[ "a", "b" ].push("c", "d");
apply
将数组转换为参数列表。顺便说一下, to 的第一个参数apply
是context
,arr1
在这种情况下,因为您希望推送适用于arr1
.
您可以使用concat
:
var arr1 = [ "a", "b" ];
var arr2 = [ "c", "d" ];
var arr3 = arr1.concat(arr2);
这使原件保持arr1
原样。您已经创建了一个新数组,其中包含arr1
和arr2
元素。如果您有对原件的引用,arr1
它将是未经修改的。这可能是不想使用concat
.
假设我们有 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]