Skip to main content

Остаточные параметры и оператор расширения

Когда мы видим "..." в коде, это могут быть как остаточные параметры, так и оператор расширения.

Как отличить их друг от друга:

  • Если ... располагается в конце списка параметров функции, то это «остаточные параметры». Он собирает остальные неуказанные аргументы и делает из них массив.
  • Если ... встретился в вызове функции или где-либо ещё, то это «оператор расширения». Он извлекает элементы из массива.

Полезно запомнить:

  • Остаточные параметры используются, чтобы создавать новые функции с неопределённым числом аргументов.
  • С помощью оператора расширения можно вставить массив в функцию, которая по умолчанию работает с обычным списком аргументов.

Вместе эти конструкции помогают легко преобразовывать наборы значений в массивы и обратно.

К аргументам функции можно обращаться и по-старому — через псевдомассив arguments.

Остаточные параметры (...)

Остаточные параметры могут быть обозначены через три точки ....

function sumAll(...args) { // args — имя массива
let sum = 0;
for (let arg of args) sum += arg;
return sum;
}
alert( sumAll(1) ); // 1
alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6

💥 Остаточные параметры должны располагаться в конце

function f(arg1, ...rest, arg2) { // arg2 после ...rest ?!
// Ошибка
}

Переменная "arguments"

Все аргументы функции находятся в псевдомассиве arguments под своими порядковыми номерами. Хотя arguments похож на массив, и его тоже можно перебирать, это всё же не массив. Методы массивов не поддерживаются.

function showName() {
alert( arguments.length );
alert( arguments[0] );
alert( arguments[1] );
// for (let arg of arguments) alert(arg); // Объект arguments можно перебирать
}
showName("Юлий", "Цезарь"); // Вывод: 2, Юлий, Цезарь
showName("Илья");// Вывод: 1, Илья, undefined (второго аргумента нет)

💥 Стрелочные функции не имеют "arguments" Если мы обратимся к arguments из стрелочной функции, то получим аргументы внешней «нормальной» функции.

Оператор расширения

Когда ...arr используется при вызове функции, он «расширяет» перебираемый объект arr в список аргументов.

let arr = [3, 5, 1];
alert( Math.max(...arr) ); // 5 (оператор "раскрывает" массив в список аргументов)

🚀 Источник: https://learn.javascript.ru/rest-parameters-spread-operator