Les opérateurs rest et spread en JavaScript peuvent être confondus car ils utilisent tous deux les trois points (...), mais ils ont des fonctions différentes en fonction du contexte dans lequel ils sont utilisés.
L'opérateur rest est utilisé pour collecter plusieurs arguments dans une fonction ou pour regrouper les éléments d'un tableau ou les propriétés d'un objet en un seul.
Il permet de regrouper tous les arguments supplémentaires passés à une fonction dans un tableau.
function sum(...numbers) {
return numbers.reduce((acc, curr) => acc + curr, 0);
}
console.log(sum(1, 2, 3)); // 6Dans cet exemple, tous les arguments passés à sum sont collectés dans le tableau numbers grâce à l'opérateur rest.
const animals = ['cat', 'dog', 'mouse', 'lion'];
const [first, ...restAnimals] = animals;
console.log(first); // "cat"
console.log(restAnimals); // ["dog", "mouse", "lion"]- Ici,
...restAnimalscapture tous les éléments restants du tableau après le premier.
Il permet de capturer les propriétés restantes d'un objet après en avoir extrait certaines.
const person = { name: 'Alice', age: 25, city: 'Paris' };
const { name, ...rest } = person;
console.log(name); // 'Alice'
console.log(rest); // { age: 25, city: 'Paris' }Ici, name est extrait de l'objet person, et le reste des propriétés (âge et ville) est regroupé dans l'objet rest.
L'opérateur spread || La Spread Syntax est utilisé pour "étaler" ou "décomposer" les éléments d'un tableau ou les propriétés d'un objet dans un autre tableau ou objet.
- Dans les tableaux : Pour copier, fusionner ou ajouter des éléments.
- Dans les objets : Pour copier ou fusionner des propriétés.
- Dans les appels de fonction : Pour passer un tableau comme une liste d'arguments.
Il permet de décomposer un tableau en plusieurs éléments distincts.
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
console.log(arr2); // [1, 2, 3, 4, 5]Dans cet exemple, le tableau arr1 est décomposé, et ses éléments sont ajoutés individuellement à arr2.
-
copier ou fusionner des tableaux:
const fruits = ['apple', 'banana']; const vegetables = ['carrot', 'potato']; const food = [...fruits, ...vegetables]; console.log(food); // ["apple", "banana", "carrot", "potato"]
- Ici,
...fruitset...vegetablesdécomposent leurs éléments dans un nouveau tableaufood.
- Ici,
-
Ajouter des éléments à un tableau :
const numbers = [1, 2, 3]; const moreNumbers = [...numbers, 4, 5]; console.log(moreNumbers); // [1, 2, 3, 4, 5]
Il permet de copier ou de fusionner des objets.
const person1 = { name: 'Alice', age: 25 };
const person2 = { ...person1, city: 'Paris' };
console.log(person2); // { name: 'Alice', age: 25, city: 'Paris' }Ici, les propriétés de person1 sont décomposées et copiées dans person2, avec l'ajout de la propriété city.
Passer un tableau comme arguments d'une fonction :
const numbers = [1, 2, 3];
const sum = (a, b, c) => a + b + c;
console.log(sum(...numbers)); // 6- Ici,
...numbersdécompose les éléments du tableau en arguments individuels pour la fonctionsum.
- Rest : regroupe plusieurs éléments en un seul (argument dans une fonction, propriétés d'un objet, etc.).
- Spread : décompose un élément en plusieurs (éléments d'un tableau ou propriétés d'un objet).
Le contexte (fonction ou structure de données) détermine si vous utilisez ... comme opérateur rest ou spread.
"Le contexte détermine si vous utilisez ... comme opérateur rest ou spread" est que la manière dont vous utilisez les trois points (...) change en fonction de la situation dans laquelle vous les placez, et c'est ce contexte qui détermine s'il s'agit de l'opérateur rest ou spread. Voici une explication plus détaillée avec des exemples spécifiques pour clarifier cela :
- Il regroupe des éléments en un seul, et il est utilisé dans les définitions de fonctions (pour regrouper les arguments) ou dans les destructurations d'objets ou de tableaux (pour capturer le reste des éléments).
Quand vous utilisez ... dans la définition des paramètres d'une fonction, c'est l'opérateur rest.
function sum(...numbers) {
// Ici, ...numbers regroupe tous les arguments dans un tableau appelé numbers
return numbers.reduce((acc, curr) => acc + curr, 0);
}
sum(1, 2, 3); // Dans ce contexte, 1, 2, et 3 sont regroupés dans un tableau [1, 2, 3]Ici, ...numbers regroupe les arguments passés à la fonction dans un seul tableau.
Quand vous utilisez ... dans la destructuration d'un objet, il regroupe les propriétés restantes de l'objet.
const person = { name: 'Alice', age: 25, city: 'Paris' };
const { name, ...rest } = person;
// Ici, ...rest regroupe toutes les autres propriétés de l'objet dans un nouvel objet
console.log(rest); // { age: 25, city: 'Paris' }Ici, ...rest regroupe toutes les autres propriétés restantes dans un objet rest.
- Il décompose ou étale des éléments d'un tableau ou d'un objet dans une nouvelle structure. Il est utilisé lorsqu'on appelle une fonction avec des arguments, ou lorsqu'on copie ou fusionne des objets/tables.
Quand vous utilisez ... dans le contexte où vous étalez les éléments d'un tableau ou d'un objet, c'est l'opérateur spread.
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
// Ici, ...arr1 étale les éléments de arr1 dans arr2
console.log(arr2); // [1, 2, 3, 4, 5]Ici, ...arr1 étale les éléments de arr1 dans un nouveau tableau arr2.
Quand vous utilisez ... pour copier ou fusionner des objets, il étale les propriétés de l'objet source.
const person1 = { name: 'Alice', age: 25 };
const person2 = { ...person1, city: 'Paris' };
// Ici, ...person1 étale les propriétés de person1 dans person2
console.log(person2); // { name: 'Alice', age: 25, city: 'Paris' }- Le terme Rest Operator est officiel et fait partie des spécifications ECMAScript.
- Le terme Spread Syntax est également officiel et fait partie des spécifications ECMAScript.
- L'expression Spread Operator est souvent utilisée de manière informelle pour désigner la Spread Syntax, mais elle n'est pas officielle.
-
Rest Operator (
...) :- Regroupe les éléments restants dans une structure.
- Exemples :
- Fonction :
function sum(...args) {}. - Destructuration :
const [a, ...rest] = array.
- Fonction :
-
Spread Syntax (
...) :- Décompose les éléments d'une structure pour les étendre.
- Exemples :
- Tableau :
[...array]. - Objet :
{ ...object }. - Fonction :
sum(...array).
- Tableau :
C'est le contexte qui détermine si ... est utilisé comme Rest ou Spread !
- Rest : Vous utilisez
...dans les paramètres d'une fonction ou dans la destructuration pour regrouper plusieurs éléments. - Spread : Vous utilisez
...dans un appel de fonction ou lors de la création/modification de tableaux ou d'objets pour décomposer/étaler les éléments.
C'est le contexte (si vous définissez des paramètres ou copiez des données) qui détermine si ... est utilisé comme opérateur rest ou spread.