Il existe deux méthodes à partir de ES2015.
Cet objet est intégré aux fonctions et fait référence, de manière appropriée, aux arguments d'une fonction. Cependant, ce n'est pas techniquement un tableau, donc les opérations typiques du tableau ne fonctionneront pas dessus. La méthode suggérée consiste à utiliser Array.from
ou l'opérateur spread pour créer un tableau à partir de celui-ci.
J'ai vu d'autres réponses mentionner l'utilisation slice
. Ne fais pas ça. Il empêche les optimisations (source: MDN ).
Array.from(arguments)
[...arguments]
Cependant, je dirais que arguments
c'est problématique car cela masque ce qu'une fonction accepte comme entrée. Une arguments
fonction s'écrit généralement comme ceci:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
Parfois, l'en-tête de la fonction est écrit comme suit pour documenter les arguments à la manière du C:
function mean(/* ... */){ ... }
Mais c'est rare.
Quant à savoir pourquoi c'est problématique, prenez C, par exemple. C est rétrocompatible avec un ancien dialecte pré-ANSI du langage connu sous le nom de K&R C. K&R C permet aux prototypes de fonctions d'avoir une liste d'arguments vide.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C fournit une fonctionnalité pour varargs
( ...
), et void
pour spécifier une liste d'arguments vide.
int myFunction(void);
/* This function accepts no parameters */
Beaucoup de gens déclarent par inadvertance des fonctions avec une unspecified
liste d'arguments ( int myfunction();
), alors qu'ils s'attendent à ce que la fonction n'accepte aucun argument. Ce qui est techniquement un bug car la fonction va accepter des arguments. N'importe quel nombre d'entre eux.
Une varargs
fonction propre en C prend la forme:
int myFunction(int nargs, ...);
Et JavaScript a en fait quelque chose de similaire à cela.
Je vous ai déjà montré l'opérateur de diffusion, en fait.
...name
Il est assez polyvalent et peut également être utilisé dans la liste d'arguments d'une fonction ("paramètres de repos") pour spécifier des varargs d'une manière bien documentée:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
Ou comme une expression lambda:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
Je préfère de loin l'opérateur de propagation. C'est propre et auto-documenté.
for - in
boucle avec l'arguments
objet - une boucle `` normale '' pour itérer sur lalength
propriété doit être utilisée à la place