2013-03-16 18 views
35

Come descritto in here, un modo rapido per aggiungere l'array b all'array a in javascript è a.push.apply(a, b).Perché Array.push.apply non funziona?

Si noterà che l'oggetto a viene utilizzato due volte. In realtà vogliamo solo la funzione push e b.push.apply(a, b) ottiene esattamente la stessa cosa: il primo argomento di apply fornisce lo this per la funzione applicata.

Ho pensato che avrebbe più senso utilizzare direttamente i metodi dell'oggetto Array: Array.push.apply(a, b). Ma questo non funziona!

Sono curioso perché no, e se c'è un modo migliore per raggiungere il mio obiettivo. (Applicando la funzione push senza bisogno di invocare una matrice specifica due volte.)

+0

+1 per scoprire 'Array.push' di Firefox, anche se per caso. :-) – RobG

risposta

54

E 'Array.prototype.push, non Array.push

+1

Ah, grazie. Per qualche ragione Array.push è definito in Firefox, ma non in Chrome. (Almeno nelle rispettive console javascript.) L'utilizzo del metodo prototipo funziona bene. Immagina che fosse qualcosa di relativamente ovvio. :) – starwed

+0

@ starwed-nota che in Firefox, 'Array.push! == Array.prototype.push', chiedo che cosa fa? – RobG

+2

è una risposta valida alla tua domanda? – Ven

2

Cosa c'è di sbagliato con 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

Questo non è veramente rilevante qui (la mia domanda wasn' t su * come * per unire due array) - ma la distinzione è chiarita nella domanda a cui mi sono collegato. 'concat' restituisce una nuova funzione, piuttosto che l'aggiunta di b a a. – starwed

+6

Abbastanza soddisfacente :) E in effetti risulta 'Array.prototype.push.apply (a, b)', è * molto * più veloce: http://jsperf.com/arrayconcatvsarraypushapply – phenomnomnominal

+2

@phenomnomnominal, che non è necessariamente vero in tutto casi. Il jsperf che colleghi per estendere la lunghezza Array in ogni ciclo, che ovviamente renderà la copia di concat' più lenta ad ogni iterazione, ma se la lunghezza dell'array rimane fissa attraverso ogni iterazione allora concat può funzionare meglio, come visto qui: http://jsperf.com/array-prototype-push-apply-vs-concat/5 (esaminare tutte le altre revisioni rivela molti approcci chiari a questo semplice problema) –

5

È inoltre possibile utilizzare [].push.apply(a, b) per la notazione più breve.

+0

Per notazioni più brevi puoi usare a.push (b) –

+9

@EugeneMala No, ciò comporterebbe l'inserimento dell'intero array "b" in "a" come nuovo elemento: 'var a = [1,2], b = [3,4]; a.push (b); // [1, 2, Array [2]] ' – subarachnid