--- title: Залишкові параметри slug: Web/JavaScript/Reference/Functions/решта_параметрів tags: - JavaScript - Rest - параметри - функції translation_of: Web/JavaScript/Reference/Functions/rest_parameters ---
{{EmbedInteractiveExample("pages/js/functions-restparameters.html")}}
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
function f(a, b, ...theArgs) { // ... }
Перед останнім параметром функції може стояти ...
, в результаті решта аргументів (наданих користувачем) будуть розміщені у "стандартному" масиві JavaScript.
Лише останній параметр може бути "залишковим".
function myFun(a, b, ...manyMoreArgs) { console.log("a", a); console.log("b", b); console.log("manyMoreArgs", manyMoreArgs); } myFun("один", "два", "три", "чорити", "п'ять", "шість"); // Виведе: // a, один // b, два // manyMoreArgs, ["три", "чотири", "п'ять", "шість"]
arguments
Існують три основні відмінності між залишковими параметрами та об'єктом {{jsxref("Functions/arguments", "arguments")}}:
arguments
містить усі аргументи, передані у функцію;arguments
не є справжнім масивом, в той час, як залишкові параметри є екземплярами {{jsxref("Global_Objects/Array", "Array")}}, тобто, методи на кшталт {{jsxref("Array.sort", "sort")}}, {{jsxref("Array.map", "map")}}, {{jsxref("Array.forEach", "forEach")}} чи {{jsxref("Array/pop", "pop")}} можуть викликатись безпосередньо на них;arguments
має також власну, специфічну функціональність (наприклад, властивість callee
).Залишкові параметри були запроваджені, щоб зменшити кількість шаблонного коду, спричиненого об'єктом arguments.
// До появи залишкових параметрів, "arguments" можна було перетворити на масив таким чином: function f(a, b) { let normalArray = Array.prototype.slice.call(arguments); // -- або -- let normalArray = [].slice.call(arguments); // -- або -- let normalArray = Array.from(arguments); let first = normalArray.shift(); // OK, вертає перший аргумент let first = arguments.shift(); // ERROR (arguments не є справжнім масивом) } // Тепер ми легко можемо отримати звичайний масив за допомогою залишкових параметрів function f(...args) { let normalArray = args; let first = normalArray.shift(); // OK, вертає перший аргумент }
У цьому прикладі перший аргумент відповідає "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; }); } let 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 is not a function console.log(sortArguments(5, 3, 7, 1));
Щоб скористатись методами 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]
Специфікація |
---|
{{SpecName('ESDraft', '#sec-function-definitions', 'Function Definitions')}} |
{{Compat("javascript.functions.rest_parameters")}}