Spread (...)

La syntaxe spread décompose un tableau, une chaîne ou un objet en éléments individuels : pour copier, fusionner et passer des arguments.

Sur cette page

Exemple

#
JavaScript
const frontend = ['HTML', 'CSS']
const backend = ['Node.js']

const stack = [...frontend, 'JavaScript', ...backend]
console.log(stack)

const scores = [72, 95, 88]
console.log(Math.max(...scores))
Console
['HTML', 'CSS', 'JavaScript', 'Node.js']
95

Définition et utilisation

#

Trois points avant un tableau, une chaîne ou un autre objet itérable « déversent » ses éléments à l’endroit où une liste de valeurs est attendue : dans un nouveau tableau [...a, ...b] ou dans les arguments d’un appel Math.max(...scores).

Le spread fonctionne aussi dans les littéraux d’objets : { ...user, active: true } copie les propriétés propres et énumérables de user dans un nouvel objet. Les propriétés écrites plus tard écrasent les précédentes, ce qui permet de créer facilement une copie mise à jour ou de combiner des réglages par défaut avec les vôtres.

La copie est superficielle. Les objets et tableaux imbriqués ne sont pas copiés, seulement partagés, donc les modifier dans la copie modifie aussi l’original. Pour une copie profonde, utilisez structuredClone(). Les mêmes trois points dans les paramètres d’une fonction ou dans une déstructuration désignent l’opération inverse, c’est-à-dire rassembler le reste des éléments (rest).

Syntaxe

#
Syntaxe
const copy = [...array]
const merged = [...first, ...second]
fn(...args)
const clone = { ...object }
const updated = { ...object, key: value }

Plus d’exemples

#
Une copie mise à jour d’un objet
JavaScript
const defaults = { theme: 'dark', sounds: true, fontSize: 16 }
const userSettings = { sounds: false }

const settings = { ...defaults, ...userSettings }
console.log(settings)
console.log(defaults)
Console
{ theme: 'dark', sounds: false, fontSize: 16 }
{ theme: 'dark', sounds: true, fontSize: 16 }
Piège : une copie superficielle
JavaScript
const original = { name: 'Léa', badges: ['start'] }
const copy = { ...original }

copy.name = 'Emma'
copy.badges.push('streak')

console.log(original)
console.log(copy)
Console
{ name: 'Léa', badges: ['start', 'streak'] }
{ name: 'Emma', badges: ['start', 'streak'] }

Le tableau badges est partagé entre les deux objets. Quand vous avez besoin d’une copie indépendante de données imbriquées, utilisez structuredClone(original).

Une chaîne en lettres et des valeurs uniques
JavaScript
console.log([...'Code'])

const tags = ['js', 'css', 'js', 'html', 'css']
console.log([...new Set(tags)])
Console
['C', 'o', 'd', 'e']
['js', 'css', 'html']

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Le spread dans les objets ne copie que les propriétés propres et énumérables. Les méthodes du prototype ne seront pas transférées, donc la copie d’une instance de classe devient un objet ordinaire.
  • L’ordre compte : dans { ...defaults, ...custom }, ce sont les valeurs de custom qui gagnent, et dans { ...custom, ...defaults }, celles de defaults.
  • Avec de très grands tableaux (des centaines de milliers d’éléments), Math.max(...array) peut dépasser la limite d’arguments d’une fonction. Il est alors plus sûr d’utiliser reduce().

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.