2016-07-06 12 views
4

Wenn ich eine Funktion habe, kann ich alle ihre Argumente mit der arguments Variable weiterleiten.Wie das erste Argument der Funktion entfernen?

Jetzt habe ich eine Funktion, die eine (das erste) Argument für sich selbst benötigt und nur den Rest weiterleiten soll.

Zum Beispiel:

var calledFunction = function(num){ 
    //do something with num 
    //remove num from the arguments 
    forwardFunction(arguments); 
} 

Ich habe bereits versucht arguments.shift(); aber Argumente ist nur ein „Array-ähnliches Objekt“ und deshalb nicht die shift() Funktion nicht kennen.

Wie das erste Argument aus den Argumenten entfernen und den Rest der Reihe von Argumenten weiterleiten?

+0

In meinen Projekten wäre zu schreiben, konnte ich nur Verwandle das Argument-Objekt in ein Array, um es zu verarbeiten. Es ist schon eine Weile her, dass ich JS geschrieben habe, also kann ich mich nicht mehr genau daran erinnern, wie ich es gemacht habe. Sollte aber nicht so schwer sein. – Carcigenicate

+1

Möchten Sie jedes Element '1..n' von' arguments' als einzelnes Argument übergeben oder ein Array übergeben, das Elemente in der Position '1..n' enthält? – sdgluck

+0

Jedes Argument als einzelnes Argument. – Spen

Antwort

4

In ES6, die idiomatische Weg, dies für die Schule

var calledFunction = function(num, ...args) { 
    //do something with num 
    forwardFunction(...args); 
} 
+1

oder einfach 'forwardFunction (args)' falls die Zielfunktion ein Array erwartet. – Pointy

+1

Ein ähnlicher Ansatz mit ES6-Destrukturierung: 'calledFunction = function (... args) { var [num, ... res] = args; forwardFunction (... res); } ' –

+1

Ich habe eine einfache JsFiddle für diejenigen erstellt, die mit ..args spielen möchten: https://jsfiddle.net/MadCodeMonkey/ew9n3uxh/ –

3

Wenn Sie eine andere Funktion verwenden möchten, es zu tun, können Sie .slice() verwenden:

forwardFunction([].slice.call(arguments, 1)); 

Nun, das übergibt ein Array zu "forwardFunction". Wenn Sie alle Argumente mit Ausnahme der ersten als getrennte getrennte Argumente zu übergeben wollen, dann würden Sie haben .apply() verwenden:

forwardFunction.apply(undefined, [].slice.call(arguments, 1)); 

Für stark genutzte Funktionen, die jedoch müssen ihre Argumente in einer Aufruf einer anderen Funktion verwenden es ist besser, sorgfältig eine einfache Schleife verwenden, um die Argumente in ein Array zu kopieren: (. Man beachte, dass die Schleife das erste Argument überspringt)

var a = []; 
    for (var i = 1; i < arguments.length; ++i) 
     a[i] = arguments[i]; 
    forwardFunction(a); // or forwardFunction.apply(null, a); 

Wenn das arguments Objekt als Parameter an eine andere Funktion übergeben wird, dann kann die aufrufende Funktion im Allgemeinen nicht optimiert werden . Manchmal ist das keine große Sache, aber es ist wichtig zu wissen, wann es ist.

Siehe auch den Destrukturierungszuweisungsansatz in der Antwort von sdgluck. Ich weiß nicht, ob das Optimierungsprobleme verursacht; Ich bezweifle es, aber ich bin mir nicht sicher, wie ausgereift der ES2015-Code in den optimierenden Laufzeitsystemen der Welt ist.

+2

Aber Ihr erstes Beispiel wird ein Array übergeben, nicht eine Reihe von Argumenten (vorausgesetzt, das ist was das OP will, gewährt seine Frage zeigt die Möglichkeit, dass er denkt, dass "forwardFunction" ** sollte ein Array-Like) übergeben werden. –

+0

@torazaburo Nun ist es nicht klar, was das OP tun möchte; es ist nicht vorgeschrieben. Ich werde die Antwort erweitern. – Pointy

+1

Die Destrukturierungszuweisung ** verschlechtert wahrscheinlich die Optimierbarkeit, da sie unter den Blättern höchstwahrscheinlich in Aufrufe einer Laufzeitroutine umgewandelt wird. Auch wenn ich aufgrund der derzeitigen Einschränkungen nativ unterstützt werde, wäre ich überrascht, wenn dadurch nicht weiterhin ausgeschlossen würde, dass Funktionen optimiert werden. –

1

ES5:

forwardFunction(Array.prototype.slice.call(arguments, 1)); 

ES6:

forwardFunction([...arguments].slice(1)); 
+1

Ich habe versucht, eine Referenz zu finden, die angibt, ob eine Destrukturierung Aufgabe wie diese Probleme für die Optimierung verursacht. Es scheint nicht * so als würde es. Es ist sicherlich gut aussehend :) – Pointy

+1

Sicher, aber warum nicht direkt in den Parametern destrukturieren? –

+0

@torazaburo Ich weiß es nicht ... Ich habe nicht daran gedacht? ;-) – sdgluck