web-dev-qa-db-fra.com

Est-il possible d'obtenir tous les arguments d'une fonction sous forme d'objet unique à l'intérieur de cette fonction?

Dans PHP il y a func_num_args et func_get_args , y a-t-il quelque chose de similaire pour JavaScript?

200
rsk82

Utilisez arguments . Vous pouvez y accéder comme un tableau. Utilisez arguments.length pour le nombre d'arguments.

326
Thomas Eding

Arguments est un objet de type tableau (pas un tableau réel). Exemple de fonction ...

function testArguments () // <-- notice no arguments specified
{
    console.log(arguments); // outputs the arguments to the console
    var htmlOutput = "";
    for (var i=0; i < arguments.length; i++) {
        htmlOutput += '<li>' + arguments[i] + '</li>';
    }
    document.write('<ul>' + htmlOutput + '</ul>');
}

Essaye le...

testArguments("This", "is", "a", "test");  // outputs ["This","is","a","test"]
testArguments(1,2,3,4,5,6,7,8,9);          // outputs [1,2,3,4,5,6,7,8,9]

Détails complets: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments

129
Luke

L'objet arguments est l'endroit où les arguments des fonctions sont stockés.

L'objet arguments agit et ressemble à un tableau. En fait, il n'a pas les méthodes utilisées par les tableaux, par exemple:

Array.forEach(callback[, thisArg]);

Array.map(callback[, thisArg])

Array.filter(callback[, thisArg]);

Array.slice(begin[, end])

Array.indexOf(searchElement[, fromIndex])

Je pense que la meilleure façon de convertir un objet arguments en un tableau real est la suivante:

argumentsArray = [].slice.apply(arguments);

Cela en fera un tableau;

réutilisable:

function ArgumentsToArray(args) {
    return [].slice.apply(args);
}

(function() {
   args = ArgumentsToArray(arguments);

   args.forEach(function(value) {
      console.log('value ===', value);
   });

})('name', 1, {}, 'two', 3)

résultat: 

> value === name 
> value === 1 
> value === Object {} 
> value === two 
> value === 3 

21
iConnor

ES6 autorise une construction dans laquelle un argument de fonction est spécifié avec une notation "..." telle que 

function testArgs (...args) {
 // Where you can test picking the first element
 console.log(args[0]); 
}

Vous pouvez également le convertir en tableau si vous préférez. Si les génériques Array sont disponibles:

var args = Array.slice(arguments)

Autrement:

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

à partir de Mozilla MDN :

Vous ne devez pas couper les arguments car cela empêche les optimisations dans Moteurs JavaScript (V8 par exemple).

10
Iman Mohamadi

Comme beaucoup d'autres l'ont fait remarquer, arguments contient tous les arguments passés à une fonction.

Si vous voulez appeler une autre fonction avec les mêmes arguments, utilisez apply

Exemple:

var is_debug = true;
var debug = function() {
  if (is_debug) {
    console.log.apply(console, arguments);
  }
}

debug("message", "another argument")
7

Oui, si vous ne savez pas combien d'arguments sont possibles au moment de la déclaration d'une fonction, vous pouvez alors déclarer la fonction sans paramètre et accéder à toutes les variables par un tableau d'arguments transmis au moment de l'appel de la fonction.

3
Rubi saini

Réponse similaire à Gunnar, avec un exemple plus complet: Vous pouvez même renvoyer de manière transparente le tout:

function dumpArguments(...args) {
  for (var i = 0; i < args.length; i++)
    console.log(args[i]);
  return args;
}

dumpArguments("foo", "bar", true, 42, ["yes", "no"], { 'banana': true });

Sortie:

foo
bar
true
42
["yes","no"]
{"banana":true}

https://codepen.io/fnocke/pen/mmoxOr?editors=0010

3
Frank Nocke

Dans ES6, vous pouvez faire quelque chose comme ceci:

function foo(...args) 
{
   let [a,b,...c] = args;

   console.log(a,b,c);
}


foo(1, null,"x",true, undefined);

0
Kamil Kiełczewski