2013-03-16 196 views
35

正如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

回答

54

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

2

有什麼不對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

5

您還可以使用[].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