2012-03-01 7 views
57

Tutto ciò che si sa che arguments è un oggetto speciale che contiene tutti gli argomenti passati alla funzione.Come ottenere una porzione da "argomenti"

E fintanto che non è un array, non è possibile utilizzare qualcosa come arguments.slice(1).

Quindi la domanda: come tagliare tutto tranne il primo elemento da arguments?

UPD:

sembra che non v'è modo senza convertirlo in un array con

var args = Array.prototype.slice.call(arguments); 

Se qualcuno invia un'altra soluzione sarebbe bello, se non - Vado a controllare il il primo con la riga sopra come risposta.

+0

+ zerkms c'è indee d un modo migliore di prendere 'argomenti' e convertirlo in un array, ecc. Si prega di vedere la mia risposta qui sotto. –

risposta

110

D. Come suddividere tutto tranne il primo elemento da arguments?

Di seguito restituisce un array contenente tutti gli argomenti successivi al primo:

var slicedArgs = Array.prototype.slice.call(arguments, 1); 

Non c'è bisogno di convertire arguments ad un array prima, fare tutto in un solo passo.

+0

Credo che ci sia un lato negativo con questo. Se c'è un solo argomento aggiuntivo (oltre al primo) non viene restituito nulla. – Trevor

+0

@Trevor - No, restituisce un array con un elemento che è il secondo argomento. (Perché non restituirebbe nulla?) – nnnnnn

+0

Sì, mio ​​male. Un altro mio bug stava causando questo. – Trevor

9

È possibile "slice senza affettare" di procedurale camminando gli argomenti oggetto:

function fun() { 
    var args = []; 

    for (var i = 1; i < arguments.length; i++) { 
    args.push(arguments[i]); 
    } 

    return args; 
} 

fun(1, 2, 3, 4, 5); //=> [2, 3, 4, 5] 
+2

Sì, funziona, ma non ha senso se abbiamo un '.slice()' ;-) – zerkms

+0

Ovviamente è più facile usare 'Array.prototype.slice', ma la tua domanda era se c'era un altro modo. –

+0

sì, grazie per quello ;-) (anche se ovviamente so di 'for' :-P) – zerkms

10

Da https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments:

Non si dovrebbe fetta su argomenti perché impedisce le ottimizzazioni in motori JavaScript (V8 per esempio). Invece, prova a costruire un nuovo array iterando attraverso l'oggetto arguments.

Quindi la risposta di Paolo Rosiana sopra è corretto

+3

Forse è così. Ma non vedo come i motori di ottimizzazione non possano trattare lo one-liner della risposta accettata e ottimizzarlo nel modo che desiderano. A lungo andare è sempre un fastidio se iniziamo a programmare gli ottimizzatori (del giorno) - personalmente preferisco la chiarezza del codice. – akauppi

+2

'slice' non cambia. Restituisce una copia superficiale di elementi dall'array originale. Gli elementi dell'array originale vengono copiati nell'array restituito. Quindi non riesco a capire quale sia la differenza tra la copia manuale e il nuovo array e slice. – Maxim

2

Questo può essere un modo:

var args = Array.from(arguments).slice(1); 
+0

In questi giorni non è affatto necessario: 'function foo (... args)' – zerkms

+0

@zerkms Stavo per ignorare il tuo suggerimento per motivi di prestazioni, ma il mio test mostra i parametri di riposo come la soluzione più veloce! https://gist.github.com/18d590d12aef1e90d2ed262f4fab0c96 –

+0

Le implementazioni di @CodyAllanTaylor migliorano. A meno che tu non abbia una ragione davvero molto importante per non farlo, mi atterrei alla sintassi più leggibile – zerkms

2

immischiarsi con le funzioni di matrice non è effettivamente necessario.

Utilizzare rest parameter syntax...rest è più pulito e più conveniente.

Esempio

function argumentTest(first, ...rest) { 
    console.log("First arg:" + first); 

    // loop through the rest of the parameters 
    for(let arg of rest){ 
     console.log("- " + arg); 
    } 
} 

// call your function with any number of arguments 
argumentTest("first arg", "#2", "more arguments", "this is not an argument but a contradiction"); 

...Resto

+0

Sì, sono d'accordo in questi giorni è più conveniente. Ti ho upvoted ma non cambierò in modo retrospettivo la risposta di 5 anni verificata. – zerkms

0

È possibile utilizzare il metodo [].slice.call(arguments, 1)

[] .slice lo restituisca l'oggetto funzione fetta e si può chiamare come il arguments e 1 sono i parametri

+0

Qualsiasi modifica che hai controllato attraverso le risposte postate prima di postare le tue? La risposta identica (e anche leggermente migliore, dal momento che non assegna una matrice di lancio) è già stata pubblicata e controllata. – zerkms

Problemi correlati