Сводка

Синтаксис оставшихся параметров функции позволяет представлять неограниченное множество аргументов в виде массива.

Синтаксис

function(a, b, ...theArgs) {
  // ...
}

Описание

Если последний именованный аргумент функции имеет префикс ..., то он автоматически становится массивом с элементами от 0 до theArgs.length в соответствии с актуальным количеством аргументов, переданных в функцию.

В приведённом выше примере, theArgs будет содержать третий и последующие аргументы функции, потому как первый будет присвоен a, а второй b.

Отличия оставшихся параметров от объекта arguments

Существует три основных отличия оставшихся параметров от объекта arguments:

  • оставшиеся параметры включают только те, которым не задано отдельное имя, в то время как объект arguments содержит все аргументы, передаваемые в функцию;
  • объект arguments не является массивом, в то время как оставшиеся параметры являются экземпляром Array и методы sort, map, forEach или pop могут непосредственно у них использоваться;
  • объект arguments имеет дополнительную функциональность, специфичную только для него (например, свойство callee).

Из аргументов в массив

Оставшиеся параметры были введены для уменьшения количества шаблонного кода:

// До появления оставшихся параметров использовалось следующее:
function f(a, b){
  var args = Array.prototype.slice.call(arguments, f.length);

  // ...
}

// что эквивалентно
function(a, b, ...args) {
  
}

Примеры

Поскольку theArgs является массивом, вы можете узнать количество его элементов при помощи свойства length:

function fun1(...theArgs) {
  console.log(theArgs.length);
}

fun1();  // 0
fun1(5); // 1
fun1(5, 6, 7); // 3

В следующем примере, мы используем оставшиеся параметры для сбора аргументов, начиная со второго. Затем мы умножаем каждый из них на первый:

function multiply(multiplier, ...theArgs) {
  return theArgs.map(function (element) {
    return multiplier * element;
  });
}

var arr = multiply(2, 1, 2, 3); 
console.log(arr); // [2, 4, 6]

Следующий пример показывает как вы можете использовать методы Array оставшихся параметров, но не объекта arguments:

function sortRestArgs(...theArgs) {
  var sortedArgs = theArgs.sort();
  return sortedArgs;
}

console.log(sortRestArgs(5,3,7,1)); // отобразит 1,3,5,7

function sortArguments() {
  var sortedArgs = arguments.sort(); 
  return sortedArgs; // сортировка не выполнится
}

// вызовет TypeError: arguments.sort не является функцией
console.log(sortArguments(5,3,7,1));

Если вам требуется использовать методы Array для объекта arguments, то для этого потребуется его преобразование в настоящий массив.

Спецификации

Спецификация Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Определение функций' в этой спецификации.
Стандарт Изначальное определение.

Совместимость с браузерами

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка Нет 15.0 (15.0) Нет Нет Нет
Возможность Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка Нет Нет 15.0 (15.0) Нет Нет Нет

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: IlyaMokin, forestbird, dtretyakov, fscholz, EgorSinitcin
 Обновлялась последний раз: IlyaMokin,