This article is in need of an editorial review.
Это экспериментальная технология, часть предложения 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 6 (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) | Нет | Нет | Нет |