ES6: Операторы Spread и Rest
Новый оператор ...
называется spread (распростанение, расширение) или rest (остаток) в зависимости от того, где и как он используется.
Оператор spread
Начнём сразу с примера:
В данном примере переданный в функцию массив разделяется на три значения: Spread
, Rest
и Operator
, после чего передаются функции log
. Таким образом, оператор ...
, используемый перед массивом, или любой другой коллекцией значений (строки, объекты), называет spread.
Подобным образом использовать массив можно было и до появления оператора ...
с помощью метода функций apply
:
Использование оператора spread
Использование оператора spread не ограничивается передачей параметров функции. Несколько примеров его полезного использования:
Клонирование свойств массивов
Подобным образом можно скопировать и весь массив целиком
Важно понимать, что при подобном использовании оператора ...
происходит именно копирование всех свойств, а не ссылки на массив.
Преобразование коллекции DOM элементов
Раньше для преобразования коллекций в массивы приходилось использовать подобные конструкции:
Подобные преобразования очень распространены, но не могут похвастаться элегантностью и, тем более, очевидностью − если подобную конструкцию увидит разработчик, никогда не использовавший её самостоятельно, то его шансы понять происходящее стремятся к нулю.
Преобразование DOM коллекции в массив с помощью оператора spread выглядит следующим образом:
Замена apply для функций конструкторов
Проще всего продемонстрировать использование ...
, как замену apply
для функций конструкторов, на примере Date
. Обычно конструктор Date
работает подобным образом:
Всё работает хорошо до тех пор, пока нет необходимости передать массив [1993, 3, 24]
в конструктор Date
. В данной ситуации вам пришлось бы написать “костыль”:
ES6 даёт возможность избежать подобных ситуаций:
Оператор rest
В самом начале статьи я уже упоминал, что оператор ...
интерпретируется по-разному, в зависимости от контекста применения. Spread используется для разделения коллекций на отдельные элементы, а rest, наоборот, для соединения отдельных значений в массив.
Используя параметр ...rest
в функции log
вы говорите интерпретатору: “собери все оставшиеся элементы в массив с именем rest
”. Разумеется, если вы не передадите в функцию других именновах параметров, то ...
соберёт все аргументы:
Таким образом, больше нет необходимости переводить псевдо-массив arguments
функций в настоящий массив − оператор rest сделает это сам:
Комментарии