Ist es möglich, eine variable Anzahl von Argumenten von einem Array an eine JavaScript-Funktion zu senden?
var arr = ['a','b','c']
var func = function()
{
// debug
alert(arguments.length);
//
for(arg in arguments)
alert(arg);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
Ich habe kürzlich viel Python geschrieben und es ist ein wunderbares Muster, Varargs akzeptieren und senden zu können. z.B
def func(*args):
print len(args)
for i in args:
print i
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(*arr) // prints 4 which is what I want, then 'a','b','c','d'
Ist es in JavaScript möglich, ein Array zu senden, das als Argumentarray behandelt wird ?
javascript
variadic-functions
Feuerkrähe
quelle
quelle
for - in
Schleife mit demarguments
Objektlength
zu verwendenAntworten:
Update : Seit ES6 können Sie beim Aufrufen der Funktion einfach die Spread-Syntax verwenden:
Da ES6 auch dann, wenn Sie erwarten, Ihre Argumente als Array zu behandeln, können Sie die Spread-Syntax in der Parameterliste verwenden, zum Beispiel:
Und Sie können es mit normalen Parametern kombinieren, zum Beispiel, wenn Sie die ersten beiden Argumente separat und den Rest als Array erhalten möchten:
Und vielleicht ist es für Sie nützlich, dass Sie wissen, wie viele Argumente eine Funktion erwartet:
Aber trotzdem können Sie eine beliebige Anzahl von Argumenten übergeben ...
Die Spread-Syntax ist kürzer und "süßer" als
apply
und wenn Sie denthis
Wert nicht im Funktionsaufruf festlegen müssen , ist dies der richtige Weg.Hier ist ein Anwendungsbeispiel , wie es früher gemacht wurde:
Heutzutage empfehle ich die Verwendung
apply
nur, wenn Sie eine beliebige Anzahl von Argumenten aus einem Array übergeben und denthis
Wert festlegen müssen .apply
Takes ist derthis
Wert als erstes Argument, das beim Aufrufen der Funktion verwendet wird. Wenn wir ihnnull
in nicht striktem Code verwenden,this
verweist das Schlüsselwortfunc
im strikten Modus auf das globale Objekt (Fenster) im Inneren , wenn explizit 'use strict' verwendet wird 'oder in ES-Modulennull
verwendet werden.Beachten Sie auch, dass das
arguments
Objekt nicht wirklich ein Array ist. Sie können es konvertieren durch:Und in ES6:
arguments
Dank der Spread-Syntax wird das Objekt heutzutage jedoch nur noch selten direkt verwendet.quelle
Array.prototype.slice.call(arguments);
verhindert Browser-JS-Optimierungen wie V8. Details hierarguments
ist geplant, zugunsten des Spread-Betreibers veraltet zu sein . Ich habe keine Quelle dafür, aber ich habe es irgendwo gehört. 2. MDN gibt an, dass die Verwendungslice
desarguments
Objekts Optimierungen in Engines wie V8 verhindert. Sie schlagen vor, den "verachteten Array-Konstruktor" zu verwendenArray.from(arguments)
, oder[...arguments]
. Möchten Sie Ihre Antwort für ES2015 aktualisieren?Sie können tatsächlich so viele Werte an eine Javascript-Funktion übergeben, wie Sie möchten. Die explizit benannten Parameter erhalten die ersten Werte, aber ALLE Parameter werden im Argumentarray gespeichert.
Um das Argumentarray in "entpackter" Form zu übergeben, können Sie apply wie folgt verwenden (siehe Functional Javascript ):
quelle
Die Splat- und Spread- Operatoren sind Teil von ES6, der geplanten nächsten Version von Javascript. Bisher unterstützt sie nur Firefox. Dieser Code funktioniert in FF16 +:
Beachten Sie die unangenehme Syntax für die Verbreitung. Die übliche Syntax von
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
wird noch nicht unterstützt . Eine ES6-Kompatibilitätstabelle finden Sie hier .Beachten Sie auch die Verwendung eines
for...of
weiteren ES6-Zusatzes. Die Verwendungfor...in
für Arrays ist eine schlechte Idee .quelle
Die
apply
Funktion akzeptiert zwei Argumente. Das Objektthis
wird gebunden und die Argumente mit einem Array dargestellt.quelle
Ab ES2015 gibt es zwei Methoden.
Das
arguments
ObjektDieses Objekt ist in Funktionen integriert und verweist entsprechend auf die Argumente einer Funktion. Da es sich technisch gesehen jedoch nicht um ein Array handelt, funktionieren typische Array-Operationen nicht. Die vorgeschlagene Methode besteht darin, mit
Array.from
dem Spread-Operator ein Array daraus zu erstellen.Ich habe andere Antworten gesehen, die die Verwendung erwähnen
slice
. Tu das nicht. Es verhindert Optimierungen (Quelle: MDN ).Ich würde jedoch argumentieren, dass dies
arguments
problematisch ist, da es verbirgt, was eine Funktion als Eingabe akzeptiert. Einearguments
Funktion ist normalerweise folgendermaßen geschrieben:Manchmal wird der Funktionsheader wie folgt geschrieben, um die Argumente C-ähnlich zu dokumentieren:
Das ist aber selten.
Nehmen Sie zum Beispiel C, warum dies problematisch ist. C ist abwärtskompatibel mit einem alten Prä-ANSI-Dialekt der Sprache K & R C. Mit K & R C können Funktionsprototypen eine leere Argumentliste haben.
ANSI C bietet die Möglichkeit,
varargs
(...
) undvoid
eine leere Argumentliste anzugeben.Viele Leute deklarieren versehentlich Funktionen mit einer
unspecified
Argumentliste (int myfunction();
), wenn sie erwarten, dass die Funktion keine Argumente akzeptiert. Dies ist technisch gesehen ein Fehler , weil die Funktion wird Argumente akzeptieren. Beliebig viele von ihnen.Eine ordnungsgemäße
varargs
Funktion in C hat folgende Form:Und JavaScript hat tatsächlich etwas Ähnliches.
Spread Operator / Rest-Parameter
Ich habe Ihnen den Spread-Operator bereits gezeigt.
Es ist ziemlich vielseitig und kann auch in der Argumentliste einer Funktion ("Restparameter") verwendet werden, um Varargs auf gut dokumentierte Weise anzugeben:
Oder als Lambda-Ausdruck:
Ich bevorzuge den Spread-Operator. Es ist sauber und selbstdokumentierend.
quelle
Es heißt der
splat
Operator. Sie können dies in JavaScript tun, indem Sieapply
:quelle
Mit ES6 können Sie Ruheparameter für verwenden
varagrs
. Dies nimmt die Argumentliste und konvertiert sie in ein Array.quelle
Dies ist ein Beispielprogramm zum Berechnen der Summe von Ganzzahlen für variable Argumente und Arrays für Ganzzahlen. Hoffe das hilft.
quelle
var
deklariert einefunction scope
Variable. Die Wörter newlet
undconst
keywords (ES 2015) deklarierenblock scope
Variablen. Vor ES 2015 sollten die Variablen jedoch aus praktischen Gründen noch an die Spitze der Funktion gehoben worden sein. 2. Ihre Funktion bricht ab, wenn 1 ganzzahliger Wert angegeben wird, weil Sie ein Array fälschlicherweise als Argument akzeptiert haben (in der Frage wird nach varargs gefragt; Arrays werden nicht als Argumente akzeptiert) :CalculateSum(6) -> 0
. (Fortsetzung im nächsten Beitrag)alert
. Eigentlich nur nicht verwendenalert/prompt/confirm
, Punkt. Verwenden Sieconsole.log
stattdessen beim Debuggen. 4. Die Funktion solltereturn
ein Wert sein, nicht ein Wertalert
. 5. Vermeiden SiePascalCase
es, es sei denn, es bezieht sich auf einen "Datentyp". Dh eine Klasse. Verwenden SiecamelCase
oderunder_score
stattdessen. 4. Mir gefällt nicht, wie Sie Ihre Funktionen deklarieren.var f = function(){ ... }
impliziert, dass Sie möchten, dass es sich irgendwann ändert , was wahrscheinlich nicht Ihre Absicht ist. Verwenden Siefunction name(){ ... }
stattdessen die herkömmliche Syntax.quelle
Für diejenigen, die hier von der Übergabe einer variablen Anzahl von Argumenten von einer Funktion an eine andere umgeleitet wurden (was nicht sollte) als Duplikat dieser Frage markiert werden ):
Wenn Sie versuchen, eine variable Anzahl von Argumenten von einer Funktion an eine andere zu übergeben, können Sie seit JavaScript 1.8.5 einfach
apply()
die zweite Funktion aufrufen und denarguments
Parameter übergeben:Hinweis: Das erste Argument ist der
this
zu verwendende Parameter. Vorbeigehennull
wird die Funktion aus dem globalen Kontext aufgerufen, dh als globale Funktion anstelle der Methode eines Objekts.Gemäß diesem Dokument wurde in der ECMAScript 5-Spezifikation die
apply()
Methode neu definiert , um ein "generisches Array-ähnliches Objekt" anstelle eines strengen Arrays zu verwenden. So können Sie diearguments
Liste direkt an die zweite Funktion übergeben.Getestet in Chrome 28.0, Safari 6.0.5 und IE 10. Probieren Sie es mit dieser JSFiddle aus .
quelle
Ja, Sie können die Variable nein übergeben. von Argumenten zu einer Funktion. Sie können verwenden
apply
, um dies zu erreichen.Z.B:
quelle
Möchten Sie, dass Ihre Funktion auf ein Array-Argument oder variable Argumente reagiert? Wenn letzteres der Fall ist, versuchen Sie:
Aber wenn Sie ein Array-Argument behandeln möchten
quelle