为什么Array.push.apply不工作?

为什么Array.push.apply不工作?

问题描述:

正如here所述,在javascript中将数组b附加到数组b的快速方法是a.push.apply(a, b)为什么Array.push.apply不工作?

你会注意到对象a被使用了两次。真的,我们只想要push函数和b.push.apply(a, b)完成完全相同的事情 - apply的第一个参数为应用函数提供this

我认为直接使用Array对象的方法可能更有意义:Array.push.apply(a, b)。但是这不起作用!

我很好奇为什么不,以及是否有更好的方法来实现我的目标。 (运用push功能,而不需要调用特定阵列的两倍。)

+0

+1,用于发现Firefox的'Array.push',即使意外。 :-) – RobG 2013-03-16 01:35:12

Array.prototype.push,不Array.push

+1

啊,谢谢。出于某种原因,Array.push在Firefox中定义,但不在Chrome中定义。 (至少在各自的javascript控制台。)使用原型方法工作得很好。数字是相对明显的。 :) – starwed 2013-03-16 00:42:42

+0

@ starwed-请注意,在Firefox中,'Array.push!== Array.prototype.push',想知道它在做什么? – RobG 2013-03-16 00:58:04

+2

这是您的问题的有效答案? – Ven 2013-03-16 01:18:57

有什么不对Array.prototype.concat

var a = [1, 2, 3, 4, 5]; 
var b = [6, 7, 8, 9]; 

a = a.concat(b); // [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
+2

这不是真的在这里相关(我的问题是' *关于*如何连接两个数组) - 但是在我所关联的问题中,区分很明显。 'concat'返回一个新的函数,而不是将b附加到a。 – starwed 2013-03-16 00:43:44

+6

不够公平:)它实际上原来'Array.prototype.push.apply(A,B)',是* *得多快:http://jsperf.com/arrayconcatvsarraypushapply – phenomnomnominal 2013-03-16 00:47:14

+2

@phenomnomnominal,这在所有的不一定是真实的案例。你链接的jsperf扩展了每个循环中的数组长度,这当然会在每次迭代时使'concat'复制速度变慢,但是如果数组长度在每次迭代中保持固定,那么concat可以执行得更好,如下所示: http://jsperf.com/array-prototype-push-apply-vs-concat/5(查看所有其他修订版本,揭示了这个简单问题的许多简洁方法) – 2014-06-08 22:28:20

您还可以使用[].push.apply(a, b)来缩短符号。

+0

对于较短的表示法,您可以使用a.push(b) – 2016-09-22 00:13:57

+9

@EugeneMala没有,这将导致整个阵列 “b” 的正被推入 “A” 作为新元件: 'VAR一个= [1,2],b = [3,4]。 a.push(b)中; // [1,2,Array [2]]' – subarachnid 2016-12-23 20:34:43