Оператор rest
Оператор rest (...) — это синтаксис, который собирает несколько элементов в один массив или объект. Он противоположен spread: spread раскрывает, rest собирает.
В параметрах функции
Используется для сбора всех переданных аргументов, которые не были явно описаны в списке параметров.
function sum(...numbers) {
return numbers.reduce((acc, n) => acc + n, 0);
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(10, 20, 30, 40)); // 100
Здесь numbers — это массив, содержащий все аргументы, переданные в функцию.
...args— общепринятое имя, но можно использовать любое:...values,...items.
Полезно, когда количество аргументов неизвестно заранее — например, при обработке пользовательского ввода или API с динамическими параметрами.
В деструктуризации массивов
Позволяет извлечь первые элементы, а остальные собрать в отдельный массив.
const colors = ['красный', 'зелёный', 'синий', 'жёлтый'];
const [first, second, ...others] = colors;
console.log(first); // "красный"
console.log(second); // "зелёный"
console.log(others); // ["синий", "жёлтый"]
Можно пропустить элементы:
const [, , third, ...rest] = colors;
console.log(third); // "синий"
console.log(rest); // ["жёлтый"]
Это удобно, когда нужно работать с началом массива, а остальное — передать дальше или игнорировать.
В деструктуризации объектов
Извлекает конкретные свойства, а остальные собирает в новый объект.
const user = {
name: 'Анна',
age: 28,
email: 'anna@example.com',
role: 'user'
};
const { name, role, ...profile } = user;
console.log(name); // "Анна"
console.log(role); // "user"
console.log(profile); // { age: 28, email: 'anna@example.com' }
Часто используется в React для передачи «оставшихся» пропсов:
function Button({ variant, ...rest }) {
return <button className={variant} {...rest} />;
}
Здесь variant обрабатывается отдельно, а остальные пропсы (onClick, disabled и т.д.) передаются прямо в <button>.
Отличие от spread
| Оператор | Действие | Пример |
|---|---|---|
| spread | Раскрывает коллекцию на отдельные элементы | [...arr], {...obj} |
| rest | Собирает несколько элементов в одну коллекцию | (...args), [first, ...rest] |
Один и тот же синтаксис ... — но смысл зависит от контекста:
- В объявлении (параметры функции, деструктуризация) — это rest.
- В выражении (присваивание, вызов функции) — это spread.