Rest en JavaScript : rassembler le reste des arguments ou des propriétés

Le rest rassemble dans un tableau ou un objet toutes les valeurs restantes. Sa syntaxe, sa règle de position, et ce qui le distingue du spread.
3 min de lecture
Believemy logo

Les mêmes trois points que le spread, le comportement exactement inverse. Là où le spread ouvre une boîte, le rest en referme une : il ramasse tout ce qui n'a pas été nommé et le range dans une seule variable.


Définition

Le rest, écrit avec trois points devant un nom, rassemble les valeurs restantes dans un tableau ou dans un objet. Il apparaît à deux endroits : dans la liste des paramètres d'une fonction, et dans une Destructuration.

JAVASCRIPT
// Paramètre du reste : un vrai tableau
function somme(...nombres) {
  return nombres.reduce((a, b) => a + b, 0);
}

console.log(somme(1, 2, 3, 4)); // 10

// Avec des paramètres nommés devant
function tete(premier, ...suite) {
  return { premier, suite };
}

console.log(tete("a", "b", "c")); // { premier: "a", suite: ["b", "c"] }

C'est le remplaçant direct de l'objet arguments, avec trois avantages : le résultat est un vrai tableau, la variable porte un nom parlant, et l'écriture fonctionne dans les fonctions fléchées.


Une seule règle de position

Le rest doit toujours venir en dernier, ce qui découle de sa définition même : rassembler ce qui reste n'a de sens qu'une fois le reste connu.

JAVASCRIPT
// Refusé par le moteur
// function f(...valeurs, dernier) {}  // SyntaxError

// Accepté
function f(premier, ...valeurs) {}
Bon à savoir

Un paramètre du reste ne compte pas dans la propriété length d'une fonction, qui indique le nombre de paramètres attendus. Une fonction écrite function somme(...n) annonce donc length à zéro, ce qui surprend quand on inspecte du code.


Le rest en destructuration

C'est l'usage le plus élégant, et le moins connu quand on débute. Il permet de retirer une propriété d'un objet sans écrire de boucle ni modifier l'original.

JAVASCRIPT
// Sur un tableau
const [premier, ...autres] = [1, 2, 3];
console.log(autres); // [2, 3]

// Sur un objet : isoler une clé et garder le reste
const utilisateur = { id: 7, nom: "Ada", motDePasse: "secret" };
const { motDePasse, ...sansSecret } = utilisateur;

console.log(sansSecret); // { id: 7, nom: "Ada" }

La dernière ligne est un motif très répandu côté serveur : retirer un champ sensible avant d'envoyer un objet au client. L'original reste intact, et le nouvel objet ne contient jamais la propriété écartée.


Questions fréquentes

Question

Comment distinguer le rest du spread à la lecture ?

Regardez de quel côté du signe égal se trouvent les trois points, ou s'ils sont dans une déclaration de paramètres. À gauche d'une affectation ou dans une liste de paramètres, ils rassemblent : c'est le rest. À droite, ou dans un appel de fonction, ils étalent : c'est le Spread (...).


Question

Que vaut le paramètre si aucun argument n'est passé ?

Un tableau vide, jamais undefined. C'est un avantage discret mais réel sur l'objet arguments : vous pouvez enchaîner directement une méthode de tableau sans vérifier au préalable qu'il y a bien quelque chose à traiter.


Question

Le rest d'objet fait-il une copie profonde ?

Non, et c'est la même limite que pour le Spread (...) : seul le premier niveau est recopié. Si l'objet contient une propriété qui est elle-même un objet, les deux versions partagent cette valeur imbriquée. Pour une copie réellement indépendante, passez par structuredClone.

Termes connexes

Découvrez notre glossaire JavaScript

Tous les mots de JavaScript expliqués simplement : mots-clés, objets natifs, méthodes, erreurs et concepts. Définitions claires et exemples qui tournent, pour apprendre et pour se dépanner.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.