ÐÑÑаÑоÑнÑе паÑамеÑÑÑ (rest parameters)
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since ÑенÑÑбÑÑ 2016 г..
СинÑакÑÐ¸Ñ Ð¾ÑÑаÑоÑнÑÑ Ð¿Ð°ÑамеÑÑов ÑÑнкÑии позволÑÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ð½ÐµÐ¾Ð³ÑаниÑенное множеÑÑво аÑгÑменÑов в виде маÑÑива.
ÐнÑеÑакÑивнÑй пÑимеÑ
function sum(...theArgs) {
let total = 0;
for (const arg of theArgs) {
total += arg;
}
return total;
}
console.log(sum(1, 2, 3));
// Expected output: 6
console.log(sum(1, 2, 3, 4));
// Expected output: 10
СинÑакÑиÑ
function(a, b, ...theArgs) {
// ...
}
ÐпиÑание
ÐÑли поÑледний именованнÑй аÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑии Ð¸Ð¼ÐµÐµÑ Ð¿ÑеÑÐ¸ÐºÑ ..., он авÑомаÑиÑеÑки ÑÑановиÑÑÑ Ð¼Ð°ÑÑивом Ñ ÑлеменÑами Ð¾Ñ 0 до theArgs.length-1 в ÑооÑвеÑÑÑвии Ñ Ð°ÐºÑÑалÑнÑм колиÑеÑÑвом аÑгÑменÑов, пеÑеданнÑÑ
в ÑÑнкÑиÑ.
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a);
console.log("b", b);
console.log("manyMoreArgs", manyMoreArgs);
}
myFun("один", "два", "ÑÑи", "ÑеÑÑÑе", "пÑÑÑ", "ÑеÑÑÑ");
// Console Output:
// a, один
// b, два
// manyMoreArgs, [ÑÑи, ÑеÑÑÑе, пÑÑÑ, ÑеÑÑÑ]
ÐÑлиÑÐ¸Ñ Ð¾ÑÑаÑоÑнÑÑ
паÑамеÑÑов Ð¾Ñ Ð¾Ð±ÑекÑа arguments
СÑÑеÑÑвÑÐµÑ ÑÑи оÑновнÑÑ
оÑлиÑÐ¸Ñ Ð¾ÑÑаÑоÑнÑÑ
паÑамеÑÑов Ð¾Ñ Ð¾Ð±ÑекÑа arguments:
- оÑÑаÑоÑнÑе паÑамеÑÑÑ Ð²ÐºÐ»ÑÑаÑÑ ÑолÑко Ñе, коÑоÑÑм не задано оÑделÑное имÑ, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº обÑекÑ
argumentsÑодеÑÐ¶Ð¸Ñ Ð²Ñе аÑгÑменÑÑ, пеÑедаваемÑе в ÑÑнкÑиÑ; - обÑекÑ
argumentsне ÑвлÑеÑÑÑ Ð¼Ð°ÑÑивом, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº оÑÑаÑоÑнÑе паÑамеÑÑÑ ÑвлÑÑÑÑÑ ÑкземплÑÑомArrayи меÑодÑsort,map,forEachилиpopмогÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно Ñ Ð½Ð¸Ñ Ð¸ÑполÑзоваÑÑÑÑ; - обÑекÑ
argumentsÐ¸Ð¼ÐµÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑнкÑионалÑноÑÑÑ, ÑпеÑиÑиÑнÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ (напÑимеÑ, ÑвойÑÑвоcallee).
Ðз аÑгÑменÑов в маÑÑив
ÐÑÑаÑоÑнÑе паÑамеÑÑÑ Ð±Ñли Ð²Ð²ÐµÐ´ÐµÐ½Ñ Ð´Ð»Ñ ÑменÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва Ñаблонного кода:
// Ðо поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑÑаÑоÑнÑÑ
паÑамеÑÑов "arguments" конвеÑÑиÑовали в обÑÑнÑй маÑÑив иÑполÑзÑÑ:
function f(a, b) {
var normalArray = Array.prototype.slice.call(arguments);
// -- или --
var normalArray = [].slice.call(arguments);
// -- или --
var normalArray = Array.from(arguments);
var first = normalArray.shift(); // OK, даÑÑ Ð¿ÐµÑвÑй аÑгÑменÑ
var first = arguments.shift(); // ERROR (arguments не ÑвлÑеÑÑÑ Ð¾Ð±ÑÑнÑм маÑÑивом)
}
// ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ легко полÑÑиÑÑ Ð¾ÑÑаÑоÑнÑе паÑамеÑÑÑ ÐºÐ°Ðº обÑÑнÑй маÑÑив
function f(...args) {
var normalArray = args;
var first = normalArray.shift(); // OK, даÑÑ Ð¿ÐµÑвÑй аÑгÑменÑ
}
ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ð¾ÑÑаÑоÑнÑÑ Ð¿Ð°ÑамеÑÑов
ÐÑÑаÑоÑнÑе паÑамеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð´ÐµÑÑÑÑкÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ (ÑолÑко маÑÑивÑ). ÐÑо ознаÑаеÑ, ÑÑо Ð¸Ñ Ð´Ð°Ð½Ð½Ñе могÑÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ñ ÐºÐ°Ðº оÑделÑнÑе знаÑениÑ. СмоÑÑиÑе ÐеÑÑÑÑкÑÑÑиÑÑÑÑее пÑиÑваивание.
function f(...[a, b, c]) {
return a + b + c;
}
f(1) // NaN (b и c ÑÐ°Ð²Ð½Ñ undefined)
f(1, 2, 3) // 6
f(1, 2, 3, 4) // 6 (ÑеÑвÑÑÑÑй паÑамеÑÑ Ð½Ðµ деÑÑÑÑкÑÑÑиÑован)
ÐÑимеÑÑ
Ð ÑÑом пÑимеÑе пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ Ð·Ð°Ð´Ð°Ð½ как "a", вÑоÑой как "b", Ñак ÑÑо ÑÑи аÑгÑменÑÑ Ð¸ÑполÑзÑÑÑÑÑ ÐºÐ°Ðº обÑÑно. Ðднако ÑÑеÑий аÑгÑÐ¼ÐµÐ½Ñ "manyMoreArgs" бÑÐ´ÐµÑ Ð¼Ð°ÑÑивом, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ 3-й, 4-й, 5-й, 6-й ... n-й аÑгÑменÑÑ, коÑоÑÑе пеÑедаÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ.
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a);
console.log("b", b);
console.log("manyMoreArgs", manyMoreArgs);
}
myFun("один", "два", "ÑÑи", "ÑеÑÑÑе", "пÑÑÑ", "ÑеÑÑÑ");
// a, один
// b, два
// manyMoreArgs, [ÑÑи, ÑеÑÑÑе, пÑÑÑ, ÑеÑÑÑ]
Ðиже... даже еÑли пеÑедано одно знаÑение поÑледним аÑгÑменÑом, оно вÑÑ Ñавно помеÑаеÑÑÑ Ð² маÑÑив.
// иÑполÑзование Ñой же ÑÑнкÑии, ÑÑо и в пÑимеÑе вÑÑе
myFun("один", "два", "ÑÑи");
// a, один
// b, два
// manyMoreArgs, [ÑÑи]
Ðиже... ÑÑеÑий аÑгÑÐ¼ÐµÐ½Ñ Ð½Ðµ бÑл пеÑедан, но "manyMoreArgs" вÑÑ ÐµÑÑ Ð¼Ð°ÑÑив (Ñ Ð¾ÑÑ Ð¸ пÑÑÑой).
// иÑполÑзование Ñой же ÑÑнкÑии, ÑÑо и в пÑимеÑе вÑÑе
myFun("один", "два");
// a, один
// b, два
// manyMoreArgs, []
ÐоÑколÑÐºÑ 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; // ÑÑо никогда не вÑполниÑÑÑ
}
console.log(sortArguments(5, 3, 7, 1)); // TypeError (arguments.sort is not a function)
ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Array на обÑекÑе arguments, нÑжно пÑеобÑазоваÑÑ ÐµÐ³Ð¾ в наÑÑоÑÑий маÑÑив.
function sortArguments() {
var args = Array.from(arguments);
var sortedArgs = args.sort();
return sortedArgs;
}
console.log(sortArguments(5, 3, 7, 1)); // 1, 3, 5, 7
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification > # sec-function-definitions > |