51 votes

Javascript : Paramètres "infinis" pour une fonction ?

Dans Chrome, lorsque je tape console.log dans celui ci-dessous :

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");

...il l'imprime correctement, sans erreur ni avertissement. J'ai ajouté d'autres paramètres, mais il l'imprime toujours correctement.

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");

Comment puis-je avoir une fonction paramètre "infinie" comme celle-ci ?

73voto

hugomg Points 29789

Les fonctions peuvent accéder à un objet de type tableau appelé arguments qui contient tous les arguments qu'ils ont reçus

function print_my_arguments(/**/){
    var args = arguments;
    for(var i=0; i<args.length; i++){
        console.log(args[i]);
    }
};

Et vous pouvez effectuer la conversion inverse (appeler une fonction à partir d'une liste d'arguments) avec la méthode apply :

// These are equivalent:
print_my_arguments(1,2,3);
print_my_arguments.apply(null, [1,2,3]);

// The first parameter to `apply` is the `this`.
// It is used when the function is a method.
foo.bar(1,2,3);
var f = foo.bar; f.apply(foo, [1,2,3]);

Quelques points importants à noter :

  1. arguments n'est pas un tableau réel et ne possède aucune des méthodes habituelles de tableau (slice, join, etc). Vous pouvez le convertir en tableau avec la ligne suivante :

    var args = Array.prototype.slice.call(arguments);
  2. Slice est également utile si vous voulez que votre tableau ne contienne que les arguments non nommés qui ont été reçus :

    function foo(first_arg, second_arg /**/){
        var variadic_args = Array.prototype.slice.call(arguments, 2);
    }
  3. Tous les navigateurs ne peuvent pas gérer un nombre arbitrairement élevé de paramètres de fonction. La dernière fois que j'ai testé cela, dans Chrome et IE il y avait un débordement de pile après environ 200.000 arguments. Si votre fonction peut recevoir un nombre arbitraire d'arguments, envisagez d'empaqueter tous ces arguments dans un tableau régulier à la place.

  4. Ces /**/ Les commentaires qui apparaissent dans les listes d'arguments de mes exemples ne sont pas obligatoires. Il s'agit simplement d'une convention de codage que j'utilise pour marquer mes fonctions variadiques et les différencier des fonctions ordinaires.

    // A quick glance would suggest that this function receives no
    // parameters but actually it is a variadic function that gets
    // its parameters via the `arguments` object.
    function foo(){
        console.log(arguments.length);
    }

41voto

Felix Points 90

La façon moderne de procéder consiste à utiliser paramètres de repos :

function printArguments(...args) {
  args.forEach((arg, index) => {
    console.log(`Argument ${index}:`, arg);
  });
}

printArguments('hello', true, new Date());

En utilisant le ...args tous les paramètres sont enregistrés dans un tableau nommé args .

À l'exception d'Internet Explorer, tous les navigateurs proposent déjà cette fonctionnalité dans leur dernière version.

Violon : https://jsfiddle.net/Lbf0stst/

0voto

DynasteN Points 11

Vous pouvez utiliser le tableau des arguments : jsfiddle.net/kUnJ2/

function foo() {
    for (var i = 0; i < arguments.length; i++) {
        document.body.innerHTML += arguments[i];
    }
}

foo("There ", "are ", "as ", "much ", "arguments ", "as ", "you ", "want.");

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