web-dev-qa-db-fra.com

Arguments illimités dans une fonction JavaScript

Une fonction JavaScript peut-elle accepter des arguments illimités? Quelque chose comme ça:

testArray(1, 2, 3, 4, 5...);

J'essaie:

var arr = [];
function testArray(A) {
    arr.Push(A);
}

Mais cela ne fonctionne pas (la sortie n'est que le premier argument). Ou la seule façon est:

function testArray(a, b, c, d, e...) {

}

Merci

42
rhavd

Il y a une variable "magique" bizarre que vous pouvez référencer appelée "arguments":

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

C'est comme un tableau, mais ce n'est pas un tableau. En fait, c'est tellement bizarre que vous ne devriez vraiment pas l'utiliser beaucoup du tout. Une pratique courante consiste à en obtenir les valeurs dans un tableau réel :

function foo() {
  var args = Array.prototype.slice.call(arguments, 0);
  // ...

Dans cet exemple, "args" serait un tableau normal, sans aucune bizarrerie. Il y a toutes sortes de problèmes désagréables avec les "arguments", et dans ECMAScript 5 sa fonctionnalité sera réduite.

edit - bien que l'utilisation de la fonction .slice() soit pratique, il s'avère que passer l'objet arguments hors de une fonction provoque des maux de tête pour l'optimisation, à tel point que les fonctions qui le font peuvent ne pas être optimisées du tout. La manière simple et directe de transformer arguments en tableau est donc

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

En savoir plus sur arguments et l'optimisation.

58
Pointy

Depuis ECMAScript 2015 (ou ES6), nous avons également accès à paramètres de repos qui nous donnent un moyen légèrement plus propre de gérer les arguments:

function foo(a, b, ...others) {
    console.log("a and b are ", a, b);

    for (let val of others) {
        console.log(val);
    }
}

foo(1, 2, 3, 4, 5);

Au moment d'écrire ces lignes, cela est pris en charge par Chrome 47+, Firefox 15+ et Edge. La fonctionnalité est également disponible via les deux Babel et TypeScript transpiler vers ES5.

21
Lucien Greathouse

Avec ECMAScript 6, vous pouvez utiliser le reste de la syntaxe des arguments:

const testArray = (...args) => {
    console.log(args);
};

testArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
6
Marius Tancredi
function toArray() {
   return arguments;
}

var myargs = toArray(1, 2, 3, 4, 5, 6);

Le mot clé arguments est disponible dans toutes les fonctions js

1
Zoidberg
var arr = [];
function testArray() {
    Array.prototype.Push.apply(arr, arguments);
}
1
clyfish

Il existe des méthodes héritées, mais je préfère le ES6 et versions plus récentes, donc si je veux implémenter cela, je l'ai écrit comme ci-dessous:

const func = ...arg => console.log(arg);

Une technologie simple et à la pointe de la technologie.

1
AmerllicA

Vous pouvez également le "lancer", ce qui vous évite la boucle laide:

var getArguments = function() {
    return arguments;
};

var foo = getArguments(1,2,3,4);

// console.log(foo.slice()); => TypeError: foo.slice is not a function

var foo = Object.values(foo); 

console.log(foo); // => [ 1, 2, 3, 4 ]

foo.Push(5);

console.log(foo); // => [ 1, 2, 3, 4, 5 ]
1
Nosaj Neirbo

Javascript ES5

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

Javascript ES6

const testArray = (...arg) => console.log(arg)
0
Dary