JavaScript: Spread и Rest операторы — полное руководство

Операторы spread (…) и rest (…), появившиеся в ES6, являются мощными инструментами для работы с массивами и объектами. Они имеют одинаковый синтаксис, но выполняют противоположные функции.

Оператор Spread (…)

Оператор spread — это три точки (…), «разворачивающие» элементы массива или свойства объекта.

Работа с массивами

Рассмотрим массивы русских и европейских городов:

const citiesRussia = ['Москва', 'Санкт-Петербург', 'Казань', 'Нижний Новгород'];
const citiesEurope = ['Берлин', 'Прага', 'Париж'];

Вывод citiesRussia в консоль отобразит массив. Применение оператора spread:

console.log(...citiesRussia);

Результат — вывод элементов массива как отдельных строк. Spread «разворачивает» массив. Это позволяет:

  • Клонировать массив:
const clonedCitiesRussia = [...citiesRussia];

clonedCitiesRussia — новый массив с теми же элементами, но с другой ссылкой в памяти.

  • Объединять массивы:
const allCities = [...citiesRussia, 'Вашингтон', ...citiesEurope];

Результат — объединенный массив всех городов. Порядок элементов соответствует порядку в исходных массивах. Это альтернатива методу concat():

const allCitiesConcat = citiesEurope.concat(citiesRussia);

Spread обеспечивает более наглядный синтаксис.

Работа с объектами

Рассмотрим объекты городов с количеством жителей:

const citiesRussiaObj = { moscow: 20, saintPetersburg: 5, kazan: 2 };
const citiesEuropeObj = { berlin: 4, prague: 1, paris: 10 };

Вывод citiesRussiaObj в консоль покажет сам объект. Применение spread к объекту напрямую в console.log() некорректно. Spread «разворачивает» свойства объекта, которые нужно «собрать» в новый объект:

const clonedCitiesRussiaObj = { ...citiesRussiaObj };

Это создает новый объект — клон citiesRussiaObj. Объединение объектов:

const allCitiesObj = { ...citiesRussiaObj, ...citiesEuropeObj };

Создается новый объект, содержащий все свойства исходных объектов. При совпадении ключей, значение из последнего объекта перепишет значение из предыдущего.

Оператор Rest (…)

Оператор rest имеет тот же синтаксис, что и spread, но используется для сбора аргументов в массив или свойства объекта.

Применение в функциях

Создадим функцию суммирования двух чисел:

function sum(a, b) {
  return a + b;
}

И массив чисел:

const numbers = [1, 2, 3, 4, 5];

Вызов sum(…numbers) просуммирует только первые два элемента. Для обработки всех аргументов используем rest:

function sumRest(...rest) {
  return rest.reduce((acc, el) => acc + el, 0);
}

rest — массив всех переданных аргументов. reduce() суммирует элементы массива.

Деструктуризация с Rest

Rest используется в деструктуризации массивов и объектов для сбора оставшихся элементов:

const [a, b, ...restNumbers] = numbers;

a и b получат первые два элемента numbers, а restNumbers — массив остальных. Аналогично для объектов:

const { name, age, ...restProps } = { name: 'Max', age: 20, city: 'Moscow', country: 'Russia' };

name и age получат соответствующие значения, а restProps — объект с оставшимися свойствами.

Операторы spread и rest — мощные инструменты JavaScript, упрощающие работу с массивами и объектами. Spread «разворачивает» элементы, а rest собирает их в новые структуры данных. Понимание их различий и применения повышает эффективность работы с JavaScript.

Что будем искать? Например,программа