Est-il possible d'envoyer un nombre variable d'arguments à une fonction JavaScript, à partir d'un tableau?
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'
J'ai récemment écrit beaucoup de Python et c'est un modèle merveilleux pour pouvoir accepter des varargs et les envoyer. par exemple
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'
Est-il possible en JavaScript d'envoyer un tableau à traiter comme le tableau d'arguments?
javascript
variadic-functions
Corbeau de feu
la source
la source
for - in
boucle avec l'arguments
objet - une boucle `` normale '' pour itérer sur lalength
propriété doit être utilisée à la placeRéponses:
Mise à jour : depuis ES6, vous pouvez simplement utiliser la syntaxe de diffusion lors de l'appel de la fonction:
Depuis ES6 également si vous prévoyez de traiter vos arguments comme un tableau, vous pouvez également utiliser la syntaxe de propagation dans la liste de paramètres, par exemple:
Et vous pouvez le combiner avec des paramètres normaux, par exemple si vous souhaitez recevoir les deux premiers arguments séparément et le reste sous forme de tableau:
Et peut-être vous est-il utile de savoir combien d'arguments une fonction attend:
Mais de toute façon, vous pouvez passer un nombre arbitraire d'arguments ...
La syntaxe de diffusion est plus courte et "plus douce" que
apply
et si vous n'avez pas besoin de définir lathis
valeur dans l'appel de fonction, c'est la voie à suivre.Voici un exemple d' application , qui était l'ancienne façon de le faire:
De nos jours, je recommande de n'utiliser
apply
que si vous devez passer un nombre arbitraire d'arguments à partir d'un tableau et définir lathis
valeur.apply
prend est lathis
valeur en tant que premiers arguments, qui sera utilisée lors de l'invocation de la fonction, si nous utilisonsnull
dans un code non strict, lethis
mot - clé fera référence à l'objet Global (fenêtre) à l'intérieurfunc
, en mode strict, lors de l'utilisation explicite de 'use strict 'ou dans les modules ES,null
seront utilisés.Notez également que l'
arguments
objet n'est pas vraiment un tableau, vous pouvez le convertir en:Et dans ES6:
Mais vous utilisez rarement l'
arguments
objet directement de nos jours grâce à la syntaxe de diffusion.la source
Array.prototype.slice.call(arguments);
empêche les optimisations JS du navigateur comme V8. Détails iciarguments
est prévu d'être déprécié en faveur de l'opérateur de diffusion . Je n'ai pas de source pour cela, mais je l'ai entendu quelque part. 2. MDN déclare que l'utilisationslice
sur l'arguments
objet empêche les optimisations dans les moteurs comme V8. Ils suggèrent d'utiliser le "constructeur Array méprisé"Array.from(arguments)
, ou[...arguments]
. Souhaitez-vous mettre à jour votre réponse pour ES2015?Vous pouvez en fait transmettre autant de valeurs que vous le souhaitez à n'importe quelle fonction javascript. Les paramètres nommés explicitement obtiendront les premières valeurs, mais TOUS les paramètres seront stockés dans le tableau d'arguments.
Pour passer le tableau d'arguments sous forme "décompressé", vous pouvez utiliser apply, comme ceci (cf Javascript fonctionnel ):
la source
Les opérateurs splat et spread font partie de ES6, la prochaine version prévue de Javascript. Jusqu'à présent, seul Firefox les prend en charge. Ce code fonctionne dans FF16 +:
Notez la syntaxe awkard pour la diffusion. La syntaxe habituelle de
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
n'est pas encore prise en charge . Vous pouvez trouver un tableau de compatibilité ES6 ici .Notez également l'utilisation de
for...of
, un autre ajout d'ES6. Utiliserfor...in
pour les tableaux est une mauvaise idée .la source
La
apply
fonction prend deux arguments; l'objetthis
sera lié et les arguments représentés par un tableau.la source
Il existe deux méthodes à partir de ES2015.
L'
arguments
objetCet objet est intégré aux fonctions et fait référence, de manière appropriée, aux arguments d'une fonction. Cependant, ce n'est pas techniquement un tableau, donc les opérations typiques du tableau ne fonctionneront pas dessus. La méthode suggérée consiste à utiliser
Array.from
ou l'opérateur spread pour créer un tableau à partir de celui-ci.J'ai vu d'autres réponses mentionner l'utilisation
slice
. Ne fais pas ça. Il empêche les optimisations (source: MDN ).Cependant, je dirais que
arguments
c'est problématique car cela masque ce qu'une fonction accepte comme entrée. Unearguments
fonction s'écrit généralement comme ceci:Parfois, l'en-tête de la fonction est écrit comme suit pour documenter les arguments à la manière du C:
Mais c'est rare.
Quant à savoir pourquoi c'est problématique, prenez C, par exemple. C est rétrocompatible avec un ancien dialecte pré-ANSI du langage connu sous le nom de K&R C. K&R C permet aux prototypes de fonctions d'avoir une liste d'arguments vide.
ANSI C fournit une fonctionnalité pour
varargs
(...
), etvoid
pour spécifier une liste d'arguments vide.Beaucoup de gens déclarent par inadvertance des fonctions avec une
unspecified
liste d'arguments (int myfunction();
), alors qu'ils s'attendent à ce que la fonction n'accepte aucun argument. Ce qui est techniquement un bug car la fonction va accepter des arguments. N'importe quel nombre d'entre eux.Une
varargs
fonction propre en C prend la forme:Et JavaScript a en fait quelque chose de similaire à cela.
Spread Operator / Paramètres de repos
Je vous ai déjà montré l'opérateur de diffusion, en fait.
Il est assez polyvalent et peut également être utilisé dans la liste d'arguments d'une fonction ("paramètres de repos") pour spécifier des varargs d'une manière bien documentée:
Ou comme une expression lambda:
Je préfère de loin l'opérateur de propagation. C'est propre et auto-documenté.
la source
Cela s'appelle l'
splat
opérateur. Vous pouvez le faire en JavaScript en utilisantapply
:la source
Avec ES6, vous pouvez utiliser des paramètres de repos pour
varagrs
. Cela prend la liste d'arguments et la convertit en tableau.la source
Ceci est un exemple de programme pour calculer la somme des entiers pour les arguments de variable et le tableau sur les entiers. J'espère que cela t'aides.
la source
var
déclare unefunction scope
variable. Les nouveaux motslet
-const
clés et (ES 2015) déclarent desblock scope
variables. Avant l'ES 2015, cependant, les variables auraient dû toujours être hissées au sommet de la fonction par pratique. 2. vos pauses de fonction lorsque donné 1 valeur entière à cause de votre acceptation erronée d'un tableau comme un argument (la question demande à varargs à propos, ne pas accepter des tableaux comme arguments):CalculateSum(6) -> 0
. (suite dans l'article suivant)alert
. En fait, ne l'utilisez pasalert/prompt/confirm
, point final. Utilisezconsole.log
plutôt lors du débogage. 4. La fonction doit êtrereturn
une valeur et non une valeuralert
. 5. éviter àPascalCase
moins qu'il ne se réfère à un «type» de données. Ie une classe. UtilisezcamelCase
ou à launder_score
place. 4. Je n'aime pas la façon dont vous déclarez vos fonctions.var f = function(){ ... }
implique que vous souhaitez que cela change à un moment donné, ce qui n'est probablement pas votre intention. Utilisezfunction name(){ ... }
plutôt la syntaxe conventionnelle .la source
Pour ceux qui ont été redirigés ici de Passer un nombre variable d'arguments d'une fonction à une autre (qui ne doit pas être marqué comme un double de cette question):
Si vous essayez de passer un nombre variable d'arguments d'une fonction à une autre, depuis JavaScript 1.8.5, vous pouvez simplement appeler
apply()
la deuxième fonction et passer learguments
paramètre:Remarque: Le premier argument est le
this
paramètre à utiliser. Passernull
appellera la fonction à partir du contexte global, c'est-à-dire comme une fonction globale au lieu de la méthode d'un objet.Selon ce document , la spécification ECMAScript 5 a redéfini la
apply()
méthode pour prendre n'importe quel "objet générique de type tableau", au lieu de strictement un tableau. Ainsi, vous pouvez passer directement laarguments
liste dans la deuxième fonction.Testé dans Chrome 28.0, Safari 6.0.5 et IE 10. Essayez-le avec ce JSFiddle .
la source
Oui, vous pouvez passer la variable no. d'arguments à une fonction. Vous pouvez utiliser
apply
pour y parvenir.Par exemple:
la source
Voulez-vous que votre fonction réagisse à un argument de tableau ou à des arguments de variable? Dans ce dernier cas, essayez:
Mais si vous souhaitez gérer un argument de tableau
la source