Операции spread и rest
1. Введение
В современном JavaScript появилась новая операция для работы с итерируемыми объектами такими как строка, массив или объект. Ее функционал и название, в отличии от синтаксиса, зависит от места применения.
2. Операция spread
...
- spread, распыление. Позволяет распылить коллекцию элементов в другую коллекцию, сделав копию оригинальной не изменяя ее. При этом, во время распыления, если элемент коллекции примитив - создается копия элемента, в случае сложного типа создается ссылка на оригинальный элемент.
Распыление можно использовать всего в 3-х ситуациях:
Во время вызова функции, для передачи массива элементов отдельными аргументами
В литерале массива, при создании нового массив
В литерале объекта, при создании нового объекта
2.1. Распыление аргументов
Представим ситуацию когда у нас есть массив температур за какой-то период и необходимо программно найти самую маленькую температуру в массиве используя метод Math.min()
, который ожидает несколько аргументов, а не массив.
Если передать просто массив, получим NaN
, потому что Math.min()
не умеет работать с массивом.
В данном случае нам поможет операция распыления, чтобы передать элементы массива отдельными аргументами при вызове функции.
То есть запись Math.min(...[18, 14, 12, 21, 17, 29])
аналогична Math.min(18, 14, 12, 21, 17, 29)
, операция spread распылила массив элементов в аргументы функции.
2.2. Распыление массивов
При работе с массивами можно скопировать элементы одного массива в другой. Массив copyOfHouses
будет независимой копией массива houses
и, соответственно, изменения в любом из них не отобразятся в другом.
То же самое можно было сделать используя метод slice()
, операция spread
просто позволяет записывать это более кратко, особенно когда распылений несколько.
При этом можно добавлять и удалять элементы при создании нового массива.
Можно очень удобно соединять несколько массивов в один новый. Порядок распыления исходных массивов влияет на порядок элементов в результирующем массиве.
Можно использовать классические методы массива вроде slice()
в комбинации с операцией spread
. Все, кто смотрел сериал Game of Thrones
знают, что никто, кроме дома Ланистеров не платит по долгам. Сделаем массив содержащий все дома, кроме Ланистеров.
Можно обновлять элементы не изменяя оригинальный массив, а создавая новый с обновленными значениями.
2.3. Распыление объектов
Для объектов, в будущих стандартах языка, будет так же утверждена операция spread
. А в современных браузерах, и используя такие инструменты как Babel
, его можно применять уже сейчас. Он позволяет распылять свойства одного объекта в другой.
Распыление можно использовать как замену Object.assign()
, то есть когда необходимо создать новый объект или обновить уже существующий по результату слияния нескольких других объектов.
Во время слияния можно добавлять свойства в произвольное место. Но следует помнить, что свойства распыляемого объекта могут перезаписать значение существующего свойства, если имена ключей совпадают, а распыление происходит после указания свойства.
Создадим химеру :)
3. Операция rest
...
- rest, сбор. Позволяет скопировать группу элементов коллекции в новую коллекцию, не изменяя оригинальную. При этом, во время сбора, если элемент коллекции примитив - создается копия элемента, в случае сложного типа создается ссылка на оригинальный элемент.
Используется в подписи функции для сбора аргументов или при деструктуризации, для хранения остатка элементов.
Есть функция add
, которая складывает произвольное кол-во аргументов. Получить доступ ко всем аргументам можно используя специальную переменную arguments
, но в стрелочных функциях ее нет, а в обычных функциях - она псевдомассив. Используя операцию rest
можно собрать все аргументы в массив прямо в подписи функции.
Теперь предположим, что функция add
не просто считает сумму аргументов, а еще получает первым аргументом число, которое необходимо прибавлять к каждому последующему аргументу при вычислении суммы.
Используя rest
можно взять только ту часть аргументов, которая необходима, объявив параметры до rest
. Все аргументы, для которых будут объявлены параметры, передадут им свои значения, все остальные будут помещены в массив args
.
Операция rest
собирает все оставшиеся аргументы и поэтому должна идти последней в подписи функции, иначе будет ошибка.
4. Дополнительные материалы
Last updated