JavaScript объект arguments
Определение и применение
JavaScript объект подобный массиву arguments содержит аргументы, переданные в функцию.
Объект arguments является локальной переменной, которая доступна во всех функциях, за исключением
стрелочных, она позволяет ссылаться внутри функции на аргументы функции с помощью объекта arguments. Этот
объект содержит запись для каждого аргумента, переданного в функцию, индекс первой записи начинается с 0 и
соответствует первому аргументу функции, индекс 1 соответствует второму аргументу функции и так далее.
Например:
function f( a, b, c) {
arguments[0]; // соответствует первому аргументу функции
arguments[1]; // соответствует второму аргументу функции
arguments[2]; // соответствует третьему аргументу функции
}
Аргументы через объект arguments доступны также для записи:
function f( a) {
arguments[0] = 100; // задаем значение первого аргумента функции
}
Как мы уже рассмотрели выше объект arguments не является массивом, по этой причине он не наследует методы
массива, например map() или push(). У него есть собственное length и метод
перебора [Symbol.iterator](). Чтобы преобразовать объект arguments в массив вы можете
воспользоваться спред (spread) оператором, или методом
from(), который преобразует и возвращает новый массив из массивоподобного, или итерируемого объекта:
// создаем функцию, которая выводит в консоль массив, содержащий переданные аргументы этой функции
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 может быть полезен для тех случаев, когда в функцию передается большее количество
аргументов, чем было объявлено и в зависимости от этих условий функция выполняет необходимые действия. Рассмотрим
простой пример:
function f( a, b) {
// проверяем количество переданных аргументов
arguments.length == 2 ? console.log( "да" ) : console.log( "нет");
}
f( 10,20 ); // да
f( 10,20,30 ); // нет
Вы можете определить тип передаваемых аргументов следующим образом:
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 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 синтаксис:
arguments
// например:
arguments[0] // первый аргумент функции
arguments[1] // второй аргумент функции
arguments[2] // третий аргумент функции
Спецификация
ECMAScript — объект arguments.
Свойства объекта
| Свойство | Описание |
|---|---|
callee Устарело |
Свойство ссылается на выполняемую в данный момент функцию. Пятое издание ECMAScript (ES5) запрещает его использование в строгом режиме (strict mode). |
length |
Свойство содержит количество аргументов, переданных функции. Это значение может быть больше или меньше, чем количество определенное при создании функции. |
[Symbol.iterator]() |
Начальным значением свойства @@iterator является тот же объект функции, что и начальное значение
свойства values объекта
Array
(метод возвращает новый объект итератора массива, содержащий значения для каждого индекса в массиве).
|
Примеры, попробуйте сами
Сравним современную рекурсию по имени функции с устаревшим arguments.callee (ссылкой на выполняемую
функцию):
Рекурсия по имени вместо arguments.callee
Измените число для факториала. Сравните рекурсию по имени с ошибкой доступа к callee в строгом режиме.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// Именованная рекурсия работает и в строгом режиме.
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
<p>Результат выполнения выводится в консоль.</p>
main.js
function f() {
console.log(arguments.length) // выводим в консоль количество переданных аргументов функции
for (let char of arguments) {
console.log(char) // выводим в консоль каждый переданный аргумент
}
}
f('a', 'b', 'c')
Когда arguments изменяет параметр функции
Сравните простые параметры, строгий режим и параметр со значением по умолчанию.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
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