Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

Объект arguments — это подобный массиву объект, который содержит аргументы, переданные в функцию.

Синтаксис

arguments

Описание

Объект arguments — это локальная переменная, доступная внутри любой (нестрелочной) функции. Объект arguments позволяет ссылаться на аргументы функции внутри неё. Он состоит из переданных в функцию аргументов, индексация начинается с 0. Например, если в функцию было передано 3 аргумента, обратиться к ним можно следующим образом:

arguments[0]
arguments[1]
arguments[2]

Аргументам может быть присвоено значение:

arguments[1] = 'new value';

Объект arguments не является Array. Он похож на массив, но не обладает ни одним из его свойств, кроме length. Например, у него нет метода pop. Однако он может быть преобразован в обычный массив:

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

// ES2015
const args = Array.from(arguments);
const args = [...arguments];

Использование slice на объекте arguments не позволяет сделать оптимизации в некоторых JavaScript движках (например, V8 — подробнее). Если они важны, можно попробовать вместо этого создать новый массив с аналогичной длиной и заполнить его элементами объекта arguments. Альтернативный вариант — использовать конструктор Array как функцию:

var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

Объект arguments можно использовать при вызове функции с большим количеством аргументов, чем было предусмотрено в её объявлении. Такой способ удобен для функций, в которые допустимо передавать переменное количество аргументов. Можно воспользоваться arguments.length, чтобы определить количество переданных в функцию аргументов, а затем обработать каждый из них с помощью объекта arguments. Чтобы определить количество параметров функции, описанных в её сигнатуре, можно использовать свойство Function.length.

Использование typeof с объектом arguments

Применение оператора typeof к arguments вернёт 'object'.

console.log(typeof arguments); // 'object'

Определение типов аргументов можно быть выполнено применением оператора typeof и индексацией.

// выведет тип первого аргумента
console.log(typeof arguments[0]);

Использование оператора расширения для объекта arguments

Как и с обычными массиво-подобными объектами, для преобразования объекта arguments в обычный массив можно использовать метод Array.from() или оператор расширения:

var args = Array.from(arguments);
var args = [...arguments];

 

Свойства

arguments.callee
Ссылка на функцию, которая выполняется в текущий момент.
arguments.caller
Ссылка на функцию, которая вызвала функцию, выполняющуюся в текущий момент.
arguments.length
Количество переданных в функцию аргументов.
arguments[@@iterator]
Возвращает новый объект Array Iterator, содержащий значения для каждого индекса в массиве.

Примеры

Создание функции, соединяющей несколько строк

Данный пример описывает функцию, которая соединяет несколько строк. Для этой функции объявлен только один аргумент, определяющий символ-разделитель соединяемых элементов. Функция определена следующим образом:

function myConcat(separator) {
  var args = Array.prototype.slice.call(arguments, 1);
  return args.join(separator);
}

Вы можете передать любое количество аргументов в эту функцию. Она создает строку, используя каждый аргумент:

// возвращает "red, orange, blue"
myConcat(", ", "red", "orange", "blue");

// получает "elephant; giraffe; lion; cheetah"
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");

// выводит "sage. basil. oregano. pepper. parsley"
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");

 Функция, создающая HTML списки

В данном примере приведена функция, которая создает строку с HTML-разметкой для списка. Единственный ее аргумент - строка, определяющая вид списка: если его значение равно "u", формируется неупорядоченный (маркированный) список, а если "o", то упорядоченный (нумерованный):

function list(type) {
  var result = "<" + type + "l><li>";
  var args = Array.prototype.slice.call(arguments, 1);
  result += args.join("</li><li>");
  result += "</li></" + type + "l>"; // конец списка

  return result;
}

Вы можете использовать любое количество аргументов, а функция добавит каждый элемент в список заданного первым аргументом типа. Например:

var listHTML = list("u", "One", "Two", "Three");

/* listHTML:

"<ul><li>One</li><li>Two</li><li>Three</li></ul>"

*/

Оставшиеся, деструктурированные и параметры по умолчанию

Объект arguments может использоваться совместно с оставшимися параметрами, параметрами по умолчанию или деструктурированными параметрами.

function foo(...args) {
  return arguments;
}
foo(1, 2, 3); // { "0": 1, "1": 2, "2": 3 }

Тем не менее, в нестрогих функциях соответствие между их аргументами и объектом arguments существует только в том случае, если функция не содержит никаких оставшихся параметров, параметров по умолчанию или деструктурированных параметров. Например, в функции, приведенной ниже, используется параметр по умолчанию, и в данном случае возвращаемый результат будет равен 10, а не 100:

function bar(a=1) { 
  arguments[0] = 100;
  return a;
}
bar(10); // 10

В следующем примере возвращается 100, поскольку здесь нет оставшихся параметров, параметров по умолчанию или деструктурированных параметров:

function zoo(a) { 
  arguments[0] = 100;
  return a;
}
zoo(10); // 100

На самом деле, если оставшиеся параметры, параметры по умолчанию или деструктурированные параметры не используются, формальные аргументы будут ссылаться на последние значения объекта arguments, при считывании значений формальных аргументов будут считаны последние данные из arguments, а при изменении значений формальных аргументов будет обновлен и объект arguments. Пример приведен в коде ниже:

function func(a, b) {
    arguments[0] = 90;
    arguments[1] = 99;
    console.log(a + " " + b);
}

func(1, 2); //90, 99

или

function func(a, b) {
    a = 9;
    b = 99;
    console.log(arguments[0] + " " + arguments[1]);
}

func(3, 4); //9, 99

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

function func(a, b, c=9) {
    arguments[0] = 99;
    arguments[1] = 98;
    console.log(a + " " + b);
}

func(3, 4); //3, 4

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

Спецификация Статус Коментарии
ECMAScript 1st Edition (ECMA-262) Стандарт Изначальное определение. Реализовано в JavaScript 1.1
ECMAScript 5.1 (ECMA-262)
Определение 'Arguments Object' в этой спецификации.
Стандарт  
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Arguments Exotic Objects' в этой спецификации.
Стандарт  
ECMAScript Latest Draft (ECMA-262)
Определение 'Arguments Exotic Objects' в этой спецификации.
Черновик  

Поддержка браузерами

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidEdge MobileFirefox для AndroidOpera для AndroidiOS SafariSamsung InternetNode.js
Базовая поддержкаChrome Полная поддержка ДаEdge Полная поддержка ДаFirefox Полная поддержка 1IE Полная поддержка ДаOpera Полная поддержка ДаSafari Полная поддержка ДаWebView Android Полная поддержка ДаChrome Android Полная поддержка ДаEdge Mobile Полная поддержка ДаFirefox Android Полная поддержка 4Opera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка Даnodejs Полная поддержка Да
calleeChrome Полная поддержка ДаEdge Полная поддержка ДаFirefox Полная поддержка 1IE Полная поддержка 6Opera Полная поддержка ДаSafari Полная поддержка ДаWebView Android Полная поддержка ДаChrome Android Полная поддержка ДаEdge Mobile Полная поддержка ДаFirefox Android Полная поддержка 4Opera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка Даnodejs Полная поддержка Да
caller
УстаревшаяНестандартная
Chrome Нет поддержки НетEdge Нет поддержки НетFirefox Нет поддержки НетIE Нет поддержки ? — 9Opera Нет поддержки НетSafari Нет поддержки НетWebView Android Нет поддержки НетChrome Android Нет поддержки НетEdge Mobile Нет поддержки НетFirefox Android Нет поддержки НетOpera Android Нет поддержки НетSafari iOS Нет поддержки НетSamsung Internet Android Нет поддержки Нетnodejs Нет поддержки Нет
lengthChrome Полная поддержка ДаEdge Полная поддержка ДаFirefox Полная поддержка 1IE Полная поддержка ДаOpera Полная поддержка ДаSafari Полная поддержка ДаWebView Android Полная поддержка ДаChrome Android Полная поддержка ДаEdge Mobile Полная поддержка ДаFirefox Android Полная поддержка 4Opera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка Даnodejs Полная поддержка Да
@@iteratorChrome Полная поддержка 52Edge ? Firefox Полная поддержка 46IE Нет поддержки НетOpera Полная поддержка ДаSafari Полная поддержка 9WebView Android Полная поддержка 52Chrome Android Полная поддержка 52Edge Mobile ? Firefox Android Полная поддержка 46Opera Android Полная поддержка ДаSafari iOS Полная поддержка 9Samsung Internet Android Полная поддержка 6.0nodejs Полная поддержка Да

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки
Совместимость неизвестна  
Совместимость неизвестна
Нестандартная. Ожидается плохая кросс-браузерная поддержка.
Нестандартная. Ожидается плохая кросс-браузерная поддержка.
Устаревшая. Не следует использовать в новых веб-сайтах
Устаревшая. Не следует использовать в новых веб-сайтах

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

Метки документа и участники

Внесли вклад в эту страницу: dima74, KTatyana, Olovyanch, uleming, BychekRU, fscholz
Обновлялась последний раз: dima74,