Деструктуризация, spread и rest
Современный синтаксис, который встречается в каждом проекте и на каждом собеседовании.
Деструктуризация распаковывает значения из массивов и объектов в переменные. spread (
...) «разворачивает» элементы, rest (...) — собирает остаток.
Деструктуризация объекта и массива
const user = { name: "Аня", age: 30, city: "Москва" };
const { name, age } = user; // вытащили поля
console.log(name, age);
const [first, second] = [10, 20, 30]; // вытащили по позиции
console.log(first, second);
// значение по умолчанию и переименование
const { role = "guest", city: town } = user;
console.log(role, town);
Вывод:
Аня 30 10 20 guest Москва
spread: копирование и слияние
... в литерале «разворачивает» массив или объект. Так делают поверхностную копию и объединяют структуры.
const arr = [1, 2, 3];
const copy = [...arr, 4]; // копия + добавление
console.log(copy);
console.log(arr === copy); // разные массивы
const base = { a: 1, b: 2 };
const merged = { ...base, b: 99, c: 3 }; // b перезаписан
console.log(merged);
Вывод:
[ 1, 2, 3, 4 ]
false
{ a: 1, b: 99, c: 3 }
rest: собрать остаток
Те же три точки, но в объявлении — собирают «всё остальное» в массив или объект.
const [head, ...tail] = [1, 2, 3, 4];
console.log(head);
console.log(tail);
const { id, ...other } = { id: 7, name: "Боря", age: 25 };
console.log(id);
console.log(other);
Вывод:
1
[ 2, 3, 4 ]
7
{ name: 'Боря', age: 25 }
rest в параметрах функции
В аргументах ... собирает все переданные значения в массив — заменяет старый arguments.
function sum(...nums) {
return nums.reduce((a, b) => a + b, 0);
}
console.log(sum(1, 2, 3));
console.log(sum(10, 20, 30, 40));
Вывод:
6 100
spread vs rest
| Где | Роль | Что делает |
| В литерале / вызове | spread | разворачивает элементы |
| В объявлении / параметрах | rest | собирает остаток |
Итог
- Деструктуризация распаковывает массивы и объекты, поддерживает значения по умолчанию.
spreadразворачивает — для копий и слияния;restсобирает остаток.- Одинаковый синтаксис
..., но роль зависит от позиции.
Проверьте себя
1. Что делает spread (...) внутри литерала массива/объекта?
AСобирает остаток элементов
BРазворачивает (распаковывает) элементы в новый массив/объект
CУдаляет элементы
DСортирует массив
2. Что окажется в tail после const [head, ...tail] = [1, 2, 3, 4]?
A1
B[2, 3, 4]
C[1, 2, 3, 4]
D4
3. Чем отличаются spread и rest, если синтаксис у них одинаковый (...)?
AНичем
BРоль зависит от позиции: в литерале/вызове это spread, в объявлении/параметрах — rest
Cspread только для чисел
Drest работает только с объектами