Spread (...)

Składnia spread rozkłada tablicę, napis lub obiekt na pojedyncze elementy: do kopiowania, łączenia i przekazywania argumentów.

Na tej stronie

Przykład

#
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))
Konsola
['HTML', 'CSS', 'JavaScript', 'Node.js']
95

Definicja i zastosowanie

#

Trzy kropki przed tablicą, napisem lub innym obiektem iterowalnym „wysypują” jego elementy w miejscu, gdzie oczekiwana jest lista wartości: w nowej tablicy [...a, ...b] albo w argumentach wywołania Math.max(...scores).

Spread działa też w literałach obiektów: { ...user, active: true } kopiuje własne, wyliczalne właściwości user do nowego obiektu. Właściwości zapisane później nadpisują wcześniejsze, więc łatwo tak utworzyć zaktualizowaną kopię albo połączyć ustawienia domyślne z własnymi.

Kopia jest płytka. Zagnieżdżone obiekty i tablice nie są kopiowane, tylko współdzielone, więc ich zmiana w kopii zmieni też oryginał. Do głębokiej kopii służy structuredClone(). Te same trzy kropki w parametrach funkcji albo w destrukturyzacji oznaczają odwrotną operację, czyli zebranie reszty elementów (rest).

Składnia

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

Więcej przykładów

#
Zaktualizowana kopia obiektu
JavaScript
const defaults = { theme: 'dark', sounds: true, fontSize: 16 }
const userSettings = { sounds: false }

const settings = { ...defaults, ...userSettings }
console.log(settings)
console.log(defaults)
Konsola
{ theme: 'dark', sounds: false, fontSize: 16 }
{ theme: 'dark', sounds: true, fontSize: 16 }
Pułapka: kopia płytka
JavaScript
const original = { name: 'Ania', badges: ['start'] }
const copy = { ...original }

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

console.log(original)
console.log(copy)
Konsola
{ name: 'Ania', badges: ['start', 'streak'] }
{ name: 'Ola', badges: ['start', 'streak'] }

Tablica badges jest wspólna dla obu obiektów. Gdy potrzebujesz niezależnej kopii zagnieżdżonych danych, użyj structuredClone(original).

Napis na litery i unikalne wartości
JavaScript
console.log([...'Kod'])

const tags = ['js', 'css', 'js', 'html', 'css']
console.log([...new Set(tags)])
Konsola
['K', 'o', 'd']
['js', 'css', 'html']

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Spread w obiektach kopiuje tylko własne, wyliczalne właściwości. Metody z prototypu się nie przeniosą, więc kopia instancji klasy staje się zwykłym obiektem.
  • Kolejność ma znaczenie: w { ...defaults, ...custom } wygrywają wartości z custom, a w { ...custom, ...defaults } z defaults.
  • Przy bardzo dużych tablicach (setki tysięcy elementów) Math.max(...array) może przekroczyć limit argumentów funkcji. Bezpieczniej użyć wtedy reduce().

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.