2013-03-16 12 views
35

hereと記載されているように、配列bをjavascriptの配列aに追加する簡単な方法はa.push.apply(a, b)です。Array.push.applyが動作しないのはなぜですか?

オブジェクトaは2回使用されます。実際には、push関数がほしいだけです。b.push.apply(a, b)はまったく同じことを実現します。最初の引数applyは、適用関数のthisを提供します。

私は、Arrayオブジェクトのメソッドを直接使用するほうが意味があると考えました:Array.push.apply(a, b)。しかし、これは動作しません!

なぜ私は不思議で、私の目標を達成するためのより良い方法があるのでしょうか。 (2回特定のアレイを起動することなく、push機能を適用する。)

+0

+1は、たとえ偶然であっても、Firefoxの 'Array.push'を発見するためのものです。 :-) – RobG

答えて

54

それはArray.prototype.concatと間違っている何Array.push

+1

ああ、ありがとう。何らかの理由でArray.pushはFirefoxでは定義されていますが、Chromeでは定義されていません。 (それぞれのjavascriptコンソールでは少なくとも)。プロトタイプメソッドを使うとうまくいきます。数字は比較的明白でした。 :) – starwed

+0

@ starwed-Firefoxで、 'Array.push!== Array.prototype.push'、それは何をするのだろうか? – RobG

+2

はあなたの質問に対する有効な回答ですか? – Ven

2

Array.prototype.pushではありませんか?

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

これは実際には関係ありません(私の質問はありませんでした ' * 2つの配列を結合する方法について) - しかし、私がリンクしている質問では区別が明確になっています。 'concat'は、aにbを追加するのではなく、新しい関数を返します。 – starwed

+6

かなり十分です:)そして、実際には 'Array.prototype.push.apply(a、b)'が*もっと*高速です:http://jsperf.com/arrayconcatvsarraypushapply – phenomnomnominal

+2

@phenomnomnominal、それは必ずしもすべてではないケース。あなたがリンクするjsperfは各ループで配列の長さを拡張しますが、各反復でコピーの 'concat'を遅くすることはもちろんですが、Arrayの長さが各繰り返しで固定されている場合は、 http://jsperf.com/array-prototype-push-apply-vs-concat/5(他のすべてのリビジョンを見てみると、この単純な問題の多くのきれいな方法がわかります) –

5

[].push.apply(a, b)を使用すると、短い表記を使用することもできます。

+0

短い表記の場合は、a.push(b) –

+9

@EugeneMalaいいえ、その結果、配列 "b"は新しい要素として "a"にプッシュされます。 'var a = [1,2]、b = [3,4]; a.push(b); // [1、2、Array [2]] ' – subarachnid

関連する問題