2013-03-16 15 views
35

Wie beschrieben here, eine schnelle Möglichkeit, Array B an Array a in Javascript anfügen ist a.push.apply(a, b).Warum funktioniert Array.push.apply nicht?

Sie werden feststellen, dass das Objekt a zweimal verwendet wird. Wirklich wollen wir nur die push Funktion, und b.push.apply(a, b) führt genau die gleiche Sache - das erste Argument der Anwendung liefert die this für die angewandte Funktion.

Ich dachte, es könnte sinnvoller sein, die Methoden des Array-Objekts direkt zu verwenden: Array.push.apply(a, b). Aber das geht nicht!

Ich bin neugierig, warum nicht, und wenn es einen besseren Weg gibt, um mein Ziel zu erreichen. (Anwendung des push Funktion, ohne dass zweimal ein bestimmtes Array aufzurufen.)

+0

+1 für die Entdeckung von 'Array.push' von Firefox, auch wenn es zufällig ist. :-) – RobG

Antwort

54

Es ist Array.prototype.push, nicht Array.push

+1

Ah, danke. Aus irgendeinem Grund ist Array.push in Firefox definiert, aber nicht in Chrome. (Zumindest in den entsprechenden Javascript Konsolen.) Die Verwendung der Prototyp-Methode funktioniert gut. Zahlen war es etwas relativ offensichtlich. :) – starwed

+0

@ starwed-beachten Sie, dass in Firefox, 'Array.push! == Array.prototype.push', sich wundern, was es tut? – RobG

+2

ist es eine gültige antwort auf ihre frage? – Ven

2

Was mit Array.prototype.concat falsch ist?

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

Das ist hier nicht wirklich relevant (meine Frage war nicht' t über * how *, um zwei Arrays zu verbinden) - aber die Unterscheidung wird in der Frage deutlich gemacht, mit der ich verbunden bin. 'concat' gibt eine neue Funktion zurück, anstatt b an a anzuhängen. – starwed

+6

Fair genug :) Und es stellt sich tatsächlich 'Array.prototype.push.apply (a, b)', ist * viel * schneller: http://jsperf.com/arrayconcatvsarraypushapply – phenomnomnominal

+2

@phenomnomnominal, das ist nicht unbedingt in allen wahr Fälle. Die jsperf, auf die Sie verlinken, erweitert die Array-Länge in jeder Schleife, was natürlich das "concat" des Kopierens bei jeder Iteration verlangsamt, aber wenn die Array-Länge durch jede Iteration unverändert bleibt, kann concat besser arbeiten, wie hier zu sehen ist: http://jsperf.com/array-prototype-push-apply-vs-concat/5 (Durch alle anderen Revisionen zu sehen, zeigt viele nette Ansätze zu diesem einfachen Problem) –

5

Sie können auch [].push.apply(a, b) für kürzere Notation verwenden.

+0

Für kürzere Notation können Sie a.push (b) verwenden –

+9

@EugeneMala Nein, das würde dazu führen, dass das gesamte Array "b" als neues Element in "a" geschoben wird: 'var a = [1,2], b = [3,4]; a.push (b); // [1, 2, Array [2]] ' – subarachnid