JavaScript объект arguments

Определение и применение

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

Объект arguments является локальной переменной, которая доступна во всех функциях, за исключением стрелочных, она позволяет ссылаться внутри функции на аргументы функции с помощью объекта arguments. Этот объект содержит запись для каждого аргумента, переданного в функцию, индекс первой записи начинается с 0 и соответствует первому аргументу функции, индекс 1 соответствует второму аргументу функции и так далее.

Например:

JavaScript
function f( a, b, c) {
	arguments[0]; // соответствует первому аргументу функции
	arguments[1]; // соответствует второму аргументу функции
	arguments[2]; // соответствует третьему аргументу функции
}

Аргументы через объект arguments доступны также для записи:

JavaScript
function f( a) {
	arguments[0] = 100; // задаем значение первого аргумента функции
}

Как мы уже рассмотрели выше объект arguments не является массивом, по этой причине он не наследует методы массива, например map() или push(). У него есть собственное length и метод перебора [Symbol.iterator](). Чтобы преобразовать объект arguments в массив вы можете воспользоваться спред (spread) оператором, или методом from(), который преобразует и возвращает новый массив из массивоподобного, или итерируемого объекта:

JavaScript
// создаем функцию, которая выводит в консоль массив, содержащий переданные аргументы этой функции
function f( a, b, c) {
	const args = [...arguments]; // используем спред оператор
	const args2 = Array.from( arguments ); // используем метод from
	console.log( args, args2 ); // выводим в консоль значение переменных
}

f( 10,20,30 ); // возвращаемое значение [10, 20, 30] [10, 20, 30]

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

JavaScript
function f( a, b) {
	// проверяем количество переданных аргументов
	arguments.length == 2 ? console.log( "да" ) : console.log( "нет");
}

f( 10,20 ); // да
f( 10,20,30 ); // нет

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

JavaScript
function f( a, b) {
	console.log( typeof arguments );      // выводим в консоль тип объекта arguments
	console.log( typeof arguments[0] ); // выводим в консоль тип первого аргумента
	console.log( typeof arguments[1] ); // выводим в консоль тип второго аргумента
}

f( [1,2,3], 5 );
// object
// object
// number


f( {}, "str");
// object
// object
// string


f( ()=>0, 5 );
// object
// function
// number

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

Спецификация: ecma262

Поддерживается во всех основных браузерах с 2015 года.

Показать браузеры
Совместимостьjavascript.functions.arguments
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
arguments✓1✓12✓1✓3✓1✓18✓4✓10.1✓1✓1.0✓4.4✓1
@@iterator✓52✓12✓46✓39✓9✓52✓46✓41✓9✓6.0✓52✓9
callee✓1✓12✓1✓4✓1✓18✓4✓10.1✓1✓1.0✓4.4✓1
length✓1✓12✓1✓4✓1✓18✓4✓10.1✓1✓1.0✓4.4✓1

поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31

JavaScript синтаксис:

JavaScript
arguments

// например:
arguments[0] // первый аргумент функции
arguments[1] // второй аргумент функции
arguments[2] // третий аргумент функции

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

ECMAScript — объект arguments.

Свойства объекта

arguments: справочные сведения
Свойство Описание
callee Устарело Свойство ссылается на выполняемую в данный момент функцию. Пятое издание ECMAScript (ES5) запрещает его использование в строгом режиме (strict mode).
length Свойство содержит количество аргументов, переданных функции. Это значение может быть больше или меньше, чем количество определенное при создании функции.
[Symbol.iterator]() Начальным значением свойства @@iterator является тот же объект функции, что и начальное значение свойства values объекта Array (метод возвращает новый объект итератора массива, содержащий значения для каждого индекса в массиве).

Примеры, попробуйте сами

Сравним современную рекурсию по имени функции с устаревшим arguments.callee (ссылкой на выполняемую функцию):

Рекурсия по имени вместо arguments.callee

Измените число для факториала. Сравните рекурсию по имени с ошибкой доступа к callee в строгом режиме.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
// Именованная рекурсия работает и в строгом режиме.
function factorial(num) {
    'use strict'
    if (num <= 1) return 1
    return num * factorial(num - 1)
}
console.log(factorial(0)) // 1
console.log(factorial(3)) // 6
console.log(factorial(5)) // 120
console.log(factorial(10)) // 3628800
// Устаревшее callee в строгом режиме вызывает ошибку.
function legacy() {
    'use strict'
    return arguments.callee
}
try {
    legacy()
} catch (error) {
    console.log(error.name)
} // TypeError

В следующем примере рассмотрено как с помощью цикла for..of итерироваться по объекту arguments:

Как перебрать переданные аргументы

Добавьте аргумент в вызов f(). Проверьте длину arguments и порядок значений в цикле.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
function f() {
    console.log(arguments.length) // выводим в консоль количество переданных аргументов функции
    for (let char of arguments) {
        console.log(char) // выводим в консоль каждый переданный аргумент
    }
}

f('a', 'b', 'c')

Когда arguments изменяет параметр функции

Сравните простые параметры, строгий режим и параметр со значением по умолчанию.

index.html
HTML
<p>Результат выполнения выводится в консоль.</p>
main.js
JavaScript
function loose(value) {
    arguments[0] = 10
    return value
}
function strict(value) {
    'use strict'
    arguments[0] = 10
    return value
}
function defaults(value = 0) {
    arguments[0] = 10
    return value
}
console.log(loose(1)) // 10
console.log(strict(1)) // 1
console.log(defaults(1)) // 1
function outer(value) {
    return (() => arguments[0])()
}
console.log(outer(7)) // 7