192 votes

Est-il possible d'envoyer un nombre variable d'arguments à une fonction JavaScript?

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 les 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 tableau d'arguments?

250voto

CMS Points 315406

Utilisation appliquer:

var arr = ['a','b','c'];

var func = function() {
  alert(arguments.length);

  for(var i = 0; i < arguments.length; i++) {
    alert(arguments[i]);
  }

};

func.apply(null, arr);

Notez que null est utilisé comme premier argument s'applique, qui fixera la this mot-clé à l'objet Global (de la fenêtre) à l'intérieur d' func.

Notez également que l' arguments objet n'est pas vraiment un Tableau, vous pouvez le convertir par :

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

Et c'est peut-être utile pour vous, que vous pouvez savoir combien d'arguments d'une fonction attend:

var test = function (one, two, three) {}; 
test.length == 3;

Mais de toute façon vous pouvez passer un nombre arbitraire d'arguments...

77voto

danben Points 35312

Vous pouvez réellement transmettre autant de valeurs que vous le souhaitez à toute fonction javascript. Les paramètres explicitement nommés 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ée", vous pouvez utiliser apply, comme ceci (cf Javascript fonctionnel ):

 var otherFunc = function() {
   alert(arguments.length); // Outputs: 10
}

var myFunc = function() {
  alert(arguments.length); // Outputs: 10
  otherFunc.apply(this, arguments);
}
myFunc(1,2,3,4,5,6,7,8,9,10);
 

23voto

Tgr Points 11766

Le splat et la propagation des opérateurs font partie de l'ES6, le projet de la prochaine version de Javascript. Jusqu'à présent, seuls Firefox prend en charge. Ce code fonctionne dans FF16+:

var arr = ['quick', 'brown', 'lazy'];

var sprintf = function(str, ...args)
{
    for (arg of args) {
        str = str.replace(/%s/, arg);
    }
    return str;
}

sprintf.apply(null, ['The %s %s fox jumps over the %s dog.', ...arg]);
sprintf('The %s %s fox jumps over the %s dog.', 'slow', 'red', 'sleeping');

Remarque le awkard syntaxe de propagation. La syntaxe habituelle d' sprintf('The %s %s fox jumps over the %s dog.', ...arg); est pas encore pris en charge. Vous pouvez trouver un ES6 tableau de compatibilité ici.

Pas aussi l'utilisation d' for...of, un autre ES6 plus. À l'aide de for...in pour les tableaux est une mauvaise idée.

8voto

August Lilleaas Points 25812

La fonction apply prend deux arguments; l'objet this sera lié à, et les arguments, représentés par un tableau.

 some_func = function (a, b) { return b }
some_func.apply(obj, ["arguments", "are", "here"])
// "are"
 

5voto

Chandra Patni Points 9432

On l’appelle opérateur. Vous pouvez le faire JavaScript à l’aide de :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X