В чем разница между spread и rest операторами?
Современный JS ES6+
Spread и rest используют один синтаксис `...`, но противоположны по смыслу: spread разворачивает, rest собирает.
Spread — разворачивает
Распаковывает итерируемое или свойства объекта в отдельные элементы. Используется при вызове функции и создании массива/объекта.
const arr = [1, 2, 3];
const copy = [...arr, 4]; // разворот в новый массив
const obj = { ...user, age: 25 }; // разворот свойств
Math.max(...arr); // разворот в аргументыRest — собирает
Упаковывает оставшиеся элементы/аргументы в массив или объект. Используется в параметрах функции и при деструктуризации.
function sum(...nums) { // собирает аргументы
return nums.reduce((a, b) => a + b, 0);
}
const [first, ...others] = [1, 2, 3]; // others = [2, 3]
const { id, ...rest } = { id: 1, a: 2 }; // rest = { a: 2 }Как отличить по контексту
- Слева от
=или в параметрах функции → rest (собирает). - Справа от
=, в вызове или литерале → spread (разворачивает).
function f(...args) {} // rest
f(...[1, 2, 3]); // spreadКоротко для собеседования
Синтаксис ... один, смысл противоположный: spread разворачивает массив/объект в элементы (вызов, создание, копирование), rest собирает оставшееся в массив/объект (параметры, деструктуризация). Контекст определяет роль.