为什么 Array.push.apply 无法工作?

52

此处所述,JavaScript中一个快速把数组b追加到数组a的方法是a.push.apply(a, b)

您会注意到对象a使用了两次。实际上我们只需要push函数,b.push.apply(a, b)可以完全达到同样的效果——apply的第一个参数提供了应用函数的this

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

我想知道为什么它不能工作,并且是否有更好的方法来实现我的目标。(即在没有需要调用特定数组两次的情况下应用push函数)。


即使是偶然发现 Firefox 的 Array.push,也值得点赞。 :-) - RobG
4个回答

72

2
啊,谢谢。由于某种原因,在Firefox中定义了Array.push,但在Chrome中没有。(至少在各自的javascript控制台中如此。)使用原型方法完全没问题。看来这是相对明显的事情。 :) - starwed
@starwed - 注意,在Firefox中,Array.push !== Array.prototype.push,不知道它是做什么用的? - RobG
7
作为将来的参考,在Firefox浏览器中,Array.push(a, b, c) 等同于 Array.prototype.push.apply(a, b, c)。这只是为方便起见。 - Casey Chu
注意,您还可以使用一个数组实例将另一个数组追加到该数组中,如下所示:(在node REPL中)var a = [1,2,3,4];var b = [5,6,7,8]; a.push.apply(a,b),在'>a'的响应中返回'[ 1, 2, 3, 4, 5, 6, 7, 8 ]'。 - unsynchronized

10

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];

尽管我只是进行了一个非常快速和简单的性能测试,看起来在我的浏览器中,[].push.apply(a,b); 在这种情况下略微更快,而 concat 稍微慢一些。 - David Griffin

10

您也可以使用[].push.apply(a, b)进行更简短的表示。


为了更简短的表示,您可以使用 a.push(b)。 - Eugene Mala
18
不行,这样会把整个数组"b"作为一个新元素推入到"a"中:var a = [1,2], b = [3,4]; a.push(b); // [1, 2, Array[2]] - Đinh Carabus
请注意,[].push.apply(a, b) 会创建一个不必要的新数组实例 [],而 a.push.apply(a, b) 则使用现有的数组实例 a - kca

4

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];

4
这里并不是很相关(我的问题不是关于如何拼接两个数组的),但这个区别在我链接的问题中已经很清楚了。concat返回一个新的函数,而不是将b附加到a上。 - starwed
11
好的 :) 实际上,结果表明Array.prototype.push.apply(a, b)要快得多:http://jsperf.com/arrayconcatvsarraypushapply - phenomnomnominal
3
@phenomnomnominal,并非所有情况都是这样。你提供的jsperf链接在每个循环中将数组长度扩展,这当然会使得拼接concat在每次迭代时变得更慢,但如果数组长度在每次迭代中保持不变,那么concat可以表现更好,正如在这里所看到的:http://jsperf.com/array-prototype-push-apply-vs-concat/5(查看所有其他修订版本会发现许多解决这个简单问题的巧妙方法) - CJ Gaconnet
值得一提的是:a.push(4, 5, 6) 将元素添加到现有的数组 a 中,而 a = a.concat([4, 5, 6]) 则创建一个新的数组实例并覆盖变量 a。此外,请考虑这种情况 var a = [1,2,3], a2 = a; ,然后使用 concat 进行操作时,a2 不会发生变化,但是如果使用 push 进行操作时,则会发生变化。 - kca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接