Эта статья нуждается в редакционном обзоре. Как вы можете помочь.
Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.
Сводка
Синтаксис оставшихся параметров функции позволяет представлять неограниченное множество аргументов в виде массива.
Синтаксис
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) | Нет | Нет | Нет |