Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

Эта страница была переведена с английского языка силами сообщества. Вы тоже можете внести свой вклад, присоединившись к русскоязычному сообществу MDN Web Docs.

Остаточные параметры (rest parameters)

BaselineWidely available

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

Интерактивный пример

function sum(...theArgs) {  let total = 0;  for (const arg of theArgs) {    total += arg;  }  return total;}console.log(sum(1, 2, 3));// Expected output: 6console.log(sum(1, 2, 3, 4));// Expected output: 10

Синтаксис

js
function(a, b, ...theArgs) {  // ...}

Описание

Если последний именованный аргумент функции имеет префикс..., он автоматически становится массивом с элементами от0 доtheArgs.length-1 в соответствии с актуальным количеством аргументов, переданных в функцию.

js
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).

Из аргументов в массив

Остаточные параметры были введены для уменьшения количества шаблонного кода:

js
// До появления остаточных параметров "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)    // 6f(1, 2, 3, 4) // 6 (четвёртый параметр не деструктурирован)

Примеры

В этом примере первый аргумент задан как"a", второй как"b", так что эти аргументы используются как обычно. Однако третий аргумент"manyMoreArgs" будет массивом, который содержит 3-й, 4-й, 5-й, 6-й ... n-й аргументы, которые передаст пользователь.

js
function myFun(a, b, ...manyMoreArgs) {  console.log("a", a);  console.log("b", b);  console.log("manyMoreArgs", manyMoreArgs);}myFun("один", "два", "три", "четыре", "пять", "шесть");// a, один// b, два// manyMoreArgs, [три, четыре, пять, шесть]

Ниже... даже если передано одно значение последним аргументом, оно всё равно помещается в массив.

js
// использование той же функции, что и в примере вышеmyFun("один", "два", "три");// a, один// b, два// manyMoreArgs, [три]

Ниже... третий аргумент не был передан, но "manyMoreArgs" всё ещё массив (хотя и пустой).

js
// использование той же функции, что и в примере вышеmyFun("один", "два");// a, один// b, два// manyMoreArgs, []

ПосколькуtheArgs является массивом, количество элементов в нём определяется свойствомlength:

js
function fun1(...theArgs) {  console.log(theArgs.length);}fun1(); // 0fun1(5); // 1fun1(5, 6, 7); // 3

В следующем примере, остаточные параметры используются для сбора всех аргументов после первого в массив. Каждый из них умножается на первый параметр и возвращается массив:

js
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:

js
function sortRestArgs(...theArgs) {  var sortedArgs = theArgs.sort();  return sortedArgs;}console.log(sortRestArgs(5, 3, 7, 1)); // 1, 3, 5, 7function sortArguments() {  var sortedArgs = arguments.sort();  return sortedArgs; // это никогда не выполнится}console.log(sortArguments(5, 3, 7, 1)); // TypeError (arguments.sort is not a function)

Чтобы использовать методыArray на объектеarguments, нужно преобразовать его в настоящий массив.

js
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® 2026 Language Specification
# sec-function-definitions

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

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

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp