Cette syntaxe permet de représenter un nombre indéfini d'arguments sous forme d'un tableau.

Syntaxe

function f(a, b, ...lesArguments) {
  // ...
}

Description

Si le dernier argument fourni à la fonction est préfixé de ... (trois points), il devient un tableau dont les éléments entre 0 (inclus) et lesArguments.length (exclus) sont fournis comme arguments passés à la fonction.

Dans l'exemple précédent, lesArguments regrouperait le troisème argument (les deux premiers étant respectivement a et b) et tous les arguments suivants.

Les différences entre les paramètres Rest et l'objet arguments

Il y a trois principales différences entre les paramètres Rest et l'objet arguments :

  • les paramètres Rest ne possèdent pas de noms séparés, l'objet arguments contient chaque argument passé à la fonction
  • l'objet arguments n'est pas, à strictement parler, un tableau. Le paramètre représentant les arguments restant est une instance d'Array à laquelle on peut appliquer directement des méthodes comme sort, map, forEach ou pop
  • l'objet arguments possède des fonctionnalités spécifiques (comme, par exemple, la propriété callee)

Passer des arguments à un tableau

Ces paramètres ont été introduits afin de réduire le code passe-partout souvent induit par les arguments.

// Avant les paramètres Rest, on observait souvent ce style de code :
function f(a, b){
  var args = Array.prototype.slice.call(arguments, f.length);

  // …
}

// ce qui est l'équivalent de

function f(a, b, ...args) {
  
}

La décomposition sur les paramètres Rest

On peut également décomposer les paramètres Rest en variables distinctes :

function f(...[a, b, c]) {
  return a + b + c;
}

f(1);          // NaN (b et c valent undefined)
f(1, 2, 3);    // 6
f(1, 2, 3, 4); // 6, le dernier paramètre n'est pas décomposé

Vous pouvez également accéder aux éléments du paramètre Rest:

function fun1(...lesArguments) {
    console.log("valeur", lesArguments[0][0]);
}

fun1([5, 2], [5, 4]); // 5
fun1([8, 2]); // 8
fun1([9, 6, 7]); // 9

Exemples

lesArguments est un tableau et dispose donc d'une propriété length permettant de compter ses éléments :

function fun1(...lesArguments) {
  console.log(lesArguments.length);
}

fun1();  // 0
fun1(5); // 1
fun1(5, 6, 7); // 3

Dans l'exemple qui suit, on utilise le paramètre Rest pour collecter les arguments après le premier pour les multiplier par le premier :

function multiplier(facteur, ...lesArguments) {
  return lesArguments.map(function (element) {
    return facteur * element;
  });
}

var arr = multiplier(2, 1, 2, 3); 
console.log(arr); // [2, 4, 6]

L'exemple qui suit illustre comment on peut utiliser des méthodes de Array sur le paramètre Rest mais pas sur l'objet arguments :

function trierParamRest(...lesArguments) {
  var argumentsTriés = lesArguments.sort();
  return argumentsTriés;
}

console.log(trierParamRest(5,3,7,1)); // shows 1,3,5,7

function trierArguments() {
  var argumentsTriés = arguments.sort(); 
  return argumentsTriés; // cela ne sera jamais appelé
}

// renvoie une exception TypeError: arguments.sort n'est pas une function
console.log(trierArguments(5,3,7,1)); 

Pour utiliser les méthodes propres aux instances d'Array sur l'objet arguments, il est nécessaire de le convertir.

function trierAguments() {
  var args = Array.from(arguments);
  var argumentsTriés = args.sort();
  return argumentsTriés;
}
console.log(trierArguments(5, 3, 7, 1)); // [1, 3, 5, 7]

Spécifications

Spécification État Commentaires
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Function Definitions' dans cette spécification.
Standard Définition initiale.
ECMAScript Latest Draft (ECMA-262)
La définition de 'Function Definitions' dans cette spécification.
Projet  

Compatibilité des navigateurs

FonctionnalitéChromeEdgeFirefoxInternet ExplorerOperaSafari
Support simple471215 Non3410
Destructuring rest parameters49 Non52 Non36 ?
FonctionnalitéAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Support simple474712153410 ?
Destructuring rest parameters4949 Non5236 ? ?

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : SphinxKnight, allipierre, Bringdal, fscholz
 Dernière mise à jour par : SphinxKnight,