Объект arguments
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Объект arguments
— это подобный массиву объект, который содержит аргументы, переданные в функцию.
Примечание: Если вы пишете ES6-совместимый код, то лучше использовать остаточные параметры.
Интерактивный пример
Синтаксис
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
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-arguments-exotic-objects |
Совместимость с браузерами
BCD tables only load in the browser