В ES6 появился специальный оператор ...
,
называющийся spread.
Когда оператор spread стоит перед массивом, он разделяет этот массив на отдельные значения, превращая массив в набор параметров, необходимых для вызова функции.
Наверняка звучит непонятно, поэтому давайте
посмотрим на простом примере. Пусть у нас
есть функция, принимающая 3
параметра
и возвращающая их сумму:
function func(num1, num2, num3) {
return num1 + num2 + num3;
}
Пусть у нас также есть массив из трех элементов:
let arr = [1, 2, 3];
Очевидно, что мы не можем просто взять и передать этот массив параметром функции, вот так:
let arr = [1, 2, 3];
func(arr);
Ведь в этом случае весь массив попадет в первый параметр функции, а в этот параметр необходимо передавать число (да и в остальные параметры тоже).
Конечно же, можно поступить следующим образом:
let arr = [1, 2, 3];
func(arr[0], arr[1], arr[2]);
Но есть и более простой путь - использовать оператор spread:
let arr = [1, 2, 3];
func(...arr);
Наличие переменной не является обязательным - можно применять spread прямо к массиву:
func(...[1, 2, 3]);
Дан массив:
let arr = [1, 2, 3, 4, 5];
Дана также функция:
function func(num1, num2, num3, num4, num5) {
return num1 + num2 + num3 + num4 + num5;
}
Найдите с помощью приведенной функции сумму элементов массива.
Более сложные примеры
Пусть у нас есть вот такая функция с 5
-тью
параметрами:
function func(num1, num2, num3, num4, num5) {
return num1 + num2 + num3 + num4 + num5;
}
Мы можем с помощью spread
передать
в эту функцию один массив:
func(...[1, 2, 3, 4, 5]);
Но это не обязательно!
Можно передать два массива:
func(...[1, 2], ...[3, 4, 5]);
Можно передать часть параметров обычным способом, а часть - с помощью spread:
func(1, 2, ...[3, 4, 5]);
Или вот так:
func(1, ...[2, 3, 4], 5);
Не запуская код, определите, что выведется в консоль:
function func(n1, n2, n3, n4, n5, n6, n7, n8) {
return (n1 + n2 + n3 + n4) * (n5 + n6 + n7 + n8);
}
console.log( func(1, ...[2, 3, 4], 5, ...[6], ...[7, 8]) );
Более полезное применение
Наверняка предыдущие примеры применения оператора spread кажутся вам не очень вдохновляющими.
Давайте сделаем что-нибудь более впечатляющее. Посмотрите на следующий код:
let max = Math.max(1, 2, 3, 4, 5);
Как вы видите, в этом коде находится максимальное из чисел. Но что делать, если наши числа представлены в виде массива? Например, вот так:
let arr = [1, 2, 3, 4, 5];
Мы, увы, не можем сделать следующее:
let arr = [1, 2, 3, 4, 5];
let max = Math.max(arr); // здесь нельзя передавать массив
Конечно же, мы можем вручную проставить элементы
массива в Math.max
, вот так:
let arr = [1, 2, 3, 4, 5];
let max = Math.max(arr[0], arr[1], arr[2], arr[3], arr[4]);
Однако, в этом случае теряется всякая универсальность:
наш код будет находить максимальное значение
лишь для массива из 5
элементов.
А что, если нам понадобится больше или меньше элементов в массиве? Решение есть! Используем оператор spread:
let arr = [1, 2, 3, 4, 5]
let max = Math.max(...arr);
Данный код, не смотря на его простоту, очень
мощный. Ведь Math.max
может принимать
любое количество параметров, а значит с помощью
оператора spread мы можем использовать массив
произвольного размера!
Дан массив с числами. Используя Math.min
и spread выведите на экран минимальное значение
массива.