Les opérateurs Splat en JavaScript, équivalent à * args et ** kwargs dans Python?

J'utilise beaucoup Python, et je suis juste en train d'apprendre JavaScript en ce moment (ou je devrais réapprendre). Alors, je voulais demander, quel est l'équivalent de *args et **kwargs en JavaScript?

L'idiome le plus proche pour *args serait

 function func (a, b /*, *args*/) { var star_args = Array.prototype.slice.call (arguments, func.length); /* now star_args[0] is the first undeclared argument */ } 

En profitant du fait que Function.length est le nombre d'arguments donnés dans la définition de la fonction.

Vous pourriez empiler ceci dans une petite routine d'aide comme

 function get_star_args (func, args) { return Array.prototype.slice.call (args, func.length); } 

Et ensuite faire

 function func (a, b /*, *args*/) { var star_args = get_star_args (func, arguments); /* now star_args[0] is the first undeclared argument */ } 

Si vous êtes dans l'ambiance du sucre syntaxique, écrivez une fonction qui transforme une fonction en une autre qui est appelée avec des arguments requis et facultatifs, et transmet les arguments requis, avec tous les arguments facultatifs supplémentaires en tant que tableau en position finale:

 function argsify(fn){ return function(){ var args_in = Array.prototype.slice.call (arguments); //args called with var required = args_in.slice (0,fn.length-1); //take first n var optional = args_in.slice (fn.length-1); //take remaining optional var args_out = required; //args to call with args_out.push (optional); //with optionals as array return fn.apply (0, args_out); }; } 

Utilisez ceci comme suit:

 // original function function myfunc (a, b, star_args) { console.log (a, b, star_args[0]); // will display 1, 2, 3 } // argsify it var argsified_myfunc = argsify (myfunc); // call argsified function argsified_myfunc (1, 2, 3); 

Ensuite, vous pouvez simplement sauter tout ce mumbo jumbo si vous souhaitez demander à l'appelant de passer les arguments optionnels en tant que tableau pour commencer:

 myfunc (1, 2, [3]); 

Il n'y a vraiment aucune solution analogue pour **kwargs , puisque JS n'a pas d'arguments de mots clés. Au lieu de cela, demandez simplement à l'appelant de passer les arguments facultatifs en tant qu'objet:

 function myfunc (a, b, starstar_kwargs) { console.log (a, b, starstar_kwargs.x); } myfunc (1, 2, {x:3}; 

Mise à jour ES6

Pour plus de précision, permettez-moi d'ajouter que ES6 résout ce problème avec la fonction de paramètre restante. Voir http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html .

J'ai trouvé une bonne solution ici: http://readystate4.com/2008/08/17/javascript-argument-unpacking-converting-an-array-to-a-list-of-arguments/

Fondamentalement, utilisez function.apply(obj, [args]) au lieu de function.call . Apply prend un tableau comme le 2ème arg et 'splats' pour vous.

ES6 ajoute un opérateur de propagation à JavaScript. Certains navigateurs l' ont déjà mis en œuvre. Le code suivant a été testé sur Firefox 35.

 function choose(choice, ...availableChoices) { return availableChoices[choice]; } choose(2, "one", "two", "three", "four"); // returns "three" 

L'équivalent le plus proche est l' arguments pseudo-tableau .

ECMAScript 6 aura des paramètres de repos qui font la même chose que l'opérateur splat.