From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../reference/functions/rest_parameters/index.html | 209 +++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 files/ru/web/javascript/reference/functions/rest_parameters/index.html (limited to 'files/ru/web/javascript/reference/functions/rest_parameters') diff --git a/files/ru/web/javascript/reference/functions/rest_parameters/index.html b/files/ru/web/javascript/reference/functions/rest_parameters/index.html new file mode 100644 index 0000000000..14d9c1e334 --- /dev/null +++ b/files/ru/web/javascript/reference/functions/rest_parameters/index.html @@ -0,0 +1,209 @@ +--- +title: Оставшиеся параметры (rest parameters) +slug: Web/JavaScript/Reference/Functions/Rest_parameters +tags: + - JavaScript + - Оставшиеся параметры + - Функции +translation_of: Web/JavaScript/Reference/Functions/rest_parameters +--- +
{{jsSidebar("Functions")}} 
+ +

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

+ +

{{EmbedInteractiveExample("pages/js/functions-restparameters.html")}}

+ +

Синтаксис

+ +
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" конвертировали в обычный массив используя:
+
+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
+ +

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

+ + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарий
{{SpecName('ES6', '#sec-function-definitions', 'Определение функций')}}{{Spec2('ES6')}}Изначальное определение.
{{SpecName('ESDraft', '#sec-function-definitions', 'Function Definitions')}}{{Spec2('ESDraft')}}
+ +

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

+ +
{{Compat("javascript.functions.rest_parameters")}}
+ +
+ +

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

+ + -- cgit v1.2.3-54-g00ecf