Javascript 为什么';t Array.push.apply工作?

Javascript 为什么';t Array.push.apply工作?,javascript,arrays,apply,Javascript,Arrays,Apply,如上所述,在javascript中将数组b附加到数组a的快速方法是a.push.apply(a,b) 您将注意到对象a被使用了两次。实际上,我们只需要push函数,而b.push.apply(a,b)完成了完全相同的事情——apply的第一个参数为应用的函数提供了this 我认为直接使用数组对象的方法可能更有意义:Array.push.apply(a,b)。但这不管用 我很好奇为什么不,如果有更好的方法来实现我的目标。(在不需要调用特定数组两次的情况下应用push功能。)它是数组,而不是数组。p

如上所述,在javascript中将数组b附加到数组a的快速方法是
a.push.apply(a,b)

您将注意到对象a被使用了两次。实际上,我们只需要
push
函数,而
b.push.apply(a,b)
完成了完全相同的事情——apply的第一个参数为应用的函数提供了
this

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

我很好奇为什么不,如果有更好的方法来实现我的目标。(在不需要调用特定数组两次的情况下应用
push
功能。)

它是数组,而不是
数组。push
有什么问题


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

当前版本的JS允许您将数组解压到参数中

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

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

啊,谢谢。出于某种原因,Array.push是在Firefox中定义的,但不是在Chrome中定义的。(至少在各自的javascript控制台中)使用prototype方法可以很好地工作。数据显示,这是一件相对明显的事情@注意,在Firefox中,
Array.push!==Array.prototype.push
,想知道它是做什么的吗?在Firefox中,
Array.push(a,b,c)
相当于
Array.prototype.push.apply(a,b,c)
。这只是为了方便。注意,您还可以使用一个数组的实例来附加另一个数组,如下所示:(在节点REPL中)
var a=[1,2,3,4];var b=[5,6,7,8];a、 push.apply(a,b)
返回“[1,2,3,4,5,6,7,8]”以响应“>a”,这在这里并不真正相关(我的问题不是关于如何连接两个数组)——但我链接到的问题中明确了区别
concat
返回一个新函数,而不是将b附加到a。很公平:)事实证明,
Array.prototype.push.apply(a,b)
的速度要快得多:@phenomnomnominal,这并不一定在所有情况下都是正确的。您链接到的jsperf扩展了每个循环中的数组长度,这当然会使复制
concat
在每次迭代中变慢,但是如果数组长度在每次迭代中保持不变,那么concat可以执行得更好,如图所示:(通过查看所有其他的修订版,可以发现许多巧妙的方法来解决这个简单的问题)+1用于发现Firefox的
Array.push
,即使是偶然的。:-)对于较短的表示法,可以使用a.push(b)@EugeneMala No,这将导致整个数组“b”作为新元素被推入“a”:
var a=[1,2],b=[3,4];a、 推(b);//[1,2,Array[2]]
虽然我刚刚做了一个非常快速且肮脏的性能测试,它看起来像[].push.apply(a,b);在我的浏览器中,在这种情况下会稍微快一点,而concat会稍微慢一点。
var a = [1, 2, 3, 4, 5,];
var b = [6, 7, 8, 9];

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