L'objet arguments est un objet, semblable à un tableau, correspondant aux arguments passés à une fonction.

Note du traducteur : «Variable ayant la fonction pour portée» correspond à la traduction de «Variable of the function scope» qu'il serait incorrect de traduire par «Variable de la portée de la fonction» car la portée de la fonction est la portée dans laquelle on peut appeler la fonction. Une variable locale de la fonction pourrait quant à elle avoir une portée strictement incluse dans le corps de la fonction (variable définie dans un bloc de la fonction même si cette subtilité n'existe pas en Javascript). Toute suggestion pour éviter cette tournure un peu longue sans altérer le sens est la bienvenue. (variable intrinsèque)

Syntaxe

arguments

Description

L'objet arguments est une variable locale (intrinsèque et inhérente aux fonctions) disponible dans toutes les fonctions (qui ne sont pas des fonctions fléchées) ; arguments en tant que propriété d'un objet de type Function ne peut plus être utilisé.

Vous pouvez accéder aux arguments d'une fonction à l'intérieur de celle-ci en utilisant l'objet arguments. Cet objet contient une entrée pour chaque argument passé à la fonction, l'indice de la première entrée commençant à 0. Par exemple, si une fonction est appelée avec trois arguments, on accède à ceux-ci comme suit :

arguments[0]
arguments[1]
arguments[2]

Les arguments peuvent aussi être modifiés :

arguments[1] = 'nouvelle valeur';

Type de l'objet arguments

L'objet arguments n'est pas un Array. Il est similaire à un Array, mais il n'a pas les propriétés d'un Array, exceptée la propriété length. Par exemple, il n'a pas la méthode pop. Néanmoins, il peut être converti en un vrai objet de type Array :

console.log(typeof arguments); // 'object'
var args = Array.prototype.slice.call(arguments);

// Avec ECMAScript 2015 / ES6
var args = Array.from(arguments);

Utilisation de la décomposition avec les arguments

On peut utiliser la méthode Array.from() ou encore l'opérateur de décomposition afin de convertir cet objet en un vrai Array :

var args = Array.from(arguments);
var args = [...arguments];

Important : Il est déconseillé d'utiliser slice sur les arguments car cela peut empêcher certaines optimisations des moteurs JavaScript. Pour ce scénario, on peut par exemple construire un nouveau tableau en parcourant l'objet arguments (à ce sujet, voir cette page sur les contraintes d'optimisations liées à V8). Pour cet exemple, on pourra utiliser Array.apply :

var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

L'objet arguments est disponible uniquement dans le corps d'une fonction. Tenter d'accéder à l'objet arguments en dehors de la déclaration d'une fonction renvoie une erreur.

Vous pouvez utiliser l'objet arguments si vous appelez une fonction avec plus de paramètres que ceux déclarés dans sa signature. Cette technique est utile pour les fonctions qui acceptent un nombre variable d'arguments. Vous pouvez utiliser arguments.length pour déterminer le nombre de paramètres passés à la fonction, puis utiliser chaque argument en utilisant l'objet arguments. (Pour déterminer le nombre d'arguments déclarés à la définition de la fonction, il faut utiliser la propriété Function.length.)

Propriétés

arguments.callee
Référence à la fonction en cours d'exécution.
arguments.caller
Référence à la fonction appelante.
arguments.length
Référence au nombre d'arguments passés à la fonction.
arguments[@@iterator]
Renvoie un nouvel itérateur qui contient les valeurs pour chaque indice d'arguments.

Exemples

Définir une fonction de concaténation d'un nombre variable de chaînes

Cet exemple définit une fonction qui concatène un nombre variable de chaînes. Le seul argument formel de la fonction est une chaîne spécifiant un séparateur inséré entre les chaînes concaténées. La fonction est définie comme suit :

function myConcat(separateur) {
  var args = Array.prototype.slice.call(arguments, 1);
  return args.join(separateur);
}

Vous pouvez passer n'importe quel nombre d'arguments à cette fonction ; elle créera une liste en utilisant chaque argument comme un élément de la liste.

// renvoie "rouge, orange, bleu"
myConcat(", ", "rouge", "orange", "bleu");

// renvoie "éléphant ; giraffe ; lion ; guépard"
myConcat(" ; ", "elephant", "giraffe", "lion", "guépard");

Définir une fonction de création de listes HTML

Cet exemple définit une fonction qui crée des chaînes définissant des listes HTML. Le seul argument formel de la fonction est une chaîne pouvant valoir "u" (unordered), si la liste doit être sans numérotation (avec des puces), ou "o" (ordered), si la liste doit être numérotée. La fonction est définie comme suit :

function liste(type) {
  var resultat = "<" + type + "l><li>";
  var args = Array.prototype.slice.call(arguments, 1);
  resultat += args.join("</li><li>");
  resultat += "</li></" + type + "l>"; // end list

  return resultat;
}

Vous pouvez passer n'importe quel nombre d'arguments à cette fonction ; elle créera une liste du type indiqué en ajoutant chaque argument comme élément dans la liste. Exemple :

var listeHTML = liste("u", "Un", "Deux", "Trois");

/* listeHTML vaut  :

"<ul><li>Un</li><li>Deux</li><li>Trois</li></ul>"

*/

Paramètres du reste, paramètres par défaut et décomposition

L'objet arguments peut être utilisé en combinaison avec les paramètres du reste, les paramètres par défaut ou les paramètres décomposés.

function toto(...args) {
  return args;
}
toto(1, 2, 3); // [1, 2, 3]

Toutefois, pour les fonctions utilisées en mode non-strict, un objet arguments n'est fourni à l'intérieur de la fonction uniquement si celle-ci n'utilise pas de paramètres du reste, pas de paramètres par défaut ou de paramètre décomposé. Par exemple, dans la fonction suivante, qui utilise un paramètre par défaut, ce sera 10 qui sera renvoyé (et non 100) :

function truc(a=1) { 
  arguments[0] = 100;
  return a;
}
truc(10); // 10

Si l'objet arguments est modifié dans la fonction, cela modifiera la valeur du paramètre passé. Dans cet exemple où il n'y a ni paramètres du reste, ni paramètres par défaut, ni décomposition, le résultat sera 100 :

fonction truc(a) {
  arguments[0] = 100;
  return a;
}
truc(10); // 100

En fait, lorsqu'il n'y a aucun paramètre du reste, paramètre par défaut ou aucune décomposition, les arguments formels feront références aux valeurs de l'objet arguments. Lorsqu'on aura besoin d'accéder à ces valeurs, on accèdera aux valeurs contenues dans arguments et à l'inverse, lorsqu'on modifiera ces valeurs, cela modifiera le contenu d'arguments. Par exemple

function func(a, b) {
  arguments[0] = 99;
  arguments[1] = 99;
  console.log(a + " " +b);
}

func(1, 2); // 99 99

ou encore :

function func(a, b) {
  a = 9;
  b = 99;
  console.log(arguments[0] + " " + arguments[1]);
}

func(3, 4); // 9 99

En revanche, dès qu'on utilise des paramètres du reste, des paramètres par défaut ou la décomposition, c'est le comportement normal qui sera appliqué :

function func(a, b, c = 9) {
  arguments[0] = 99;
  arguments[1] = 98;
  console.log(a + " " + b);
}

func(3, 4); // 3 4

Spécifications

Spécification État Commentaires
ECMAScript 1st Edition (ECMA-262) Standard Définition initiale. Implémentée par JavaScript 1.1
ECMAScript 5.1 (ECMA-262)
La définition de 'Arguments Object' dans cette spécification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Arguments Exotic Objects' dans cette spécification.
Standard  
ECMAScript Latest Draft (ECMA-262)
La définition de 'Arguments Exotic Objects' dans cette spécification.
Projet  

Compatibilité des navigateurs

FonctionnalitéChromeEdgeFirefoxInternet ExplorerOperaSafari
Support simple Oui Oui1 Oui Oui Oui
callee Oui Oui16 Oui Oui
caller Non Non Non Oui — 9 Non Non
length Oui Oui1 Oui Oui Oui
@@iterator52 ?46 Non Oui9
FonctionnalitéAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Support simple Oui Oui Oui4 Oui Oui Oui
callee Oui Oui Oui4 Oui Oui Oui
caller Non Non Non Non Non Non Non
length Oui Oui Oui4 Oui Oui Oui
@@iterator5252 ?46 Oui96.0

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs à cette page : SphinxKnight, gpartenet, Vixys, Marco105, fscholz, teoli, Laurent_Lyaudet
Dernière mise à jour par : SphinxKnight,