arguments в JavaScript

arguments - это специальный объект, который доступен внутри обычной функции.

В нем хранятся все аргументы, которые были переданы при вызове функции.

function showArguments() {
  console.log(arguments);
}

showArguments('JavaScript', 'React', 'Node.js');

Даже если у функции нет параметров, переданные значения все равно попадут в arguments.

Что такое arguments

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

function showFirstArgument() {
  console.log(arguments[0]);
}

showFirstArgument('Привет');

Результат:

Привет

Здесь arguments[0] - первый аргумент, который передали функции.

Доступ к аргументам

Объект arguments похож на массив: у каждого аргумента есть индекс.

function showUser(name, age) {
  console.log(arguments[0]);
  console.log(arguments[1]);
}

showUser('Анна', 25);

Результат:

Анна
25

Индексы начинаются с нуля. Первый аргумент находится в arguments[0], второй - в arguments[1] и так далее.

Свойство length

У arguments есть свойство length. Оно показывает, сколько аргументов передали функции.

function showCount() {
  console.log(arguments.length);
}

showCount('HTML', 'CSS', 'JavaScript');

Результат:

3

Это удобно, когда количество аргументов заранее неизвестно.

function sum() {
  let result = 0;

  for (let i = 0; i < arguments.length; i++) {
    result += arguments[i];
  }

  return result;
}

console.log(sum(2, 4, 6));
console.log(sum(10, 20));

Результат:

12
30

arguments - не массив

arguments похож на массив, но массивом не является.

Например, у него нет привычных методов массивов: map(), filter(), reduce().

function doubleNumbers() {
  return arguments.map(function (number) {
    return number * 2;
  });
}

doubleNumbers(1, 2, 3);

Такой код вызовет ошибку, потому что map() у arguments нет.

Если нужно работать с ним как с массивом, можно сначала преобразовать его.

function doubleNumbers() {
  let numbers = Array.from(arguments);

  return numbers.map(function (number) {
    return number * 2;
  });
}

console.log(doubleNumbers(1, 2, 3));

Результат:

[2, 4, 6]

arguments и стрелочные функции

У стрелочных функций нет своего arguments.

const showArguments = () => {
  console.log(arguments);
};

showArguments(1, 2, 3);

В таком виде arguments использовать не стоит. Для стрелочных функций лучше явно принимать параметры или использовать rest parameters.

Современная замена

В современном JavaScript вместо arguments чаще используют rest parameters.

function sum(...numbers) {
  return numbers.reduce(function (result, number) {
    return result + number;
  }, 0);
}

console.log(sum(2, 4, 6));

Результат:

12

numbers - это уже настоящий массив. С ним можно сразу использовать методы массивов.

arguments все еще встречается в старом коде, поэтому его важно понимать. Но в новом коде rest parameters обычно читаются проще.

Итого

1. arguments - это специальный объект внутри обычной функции.

2. В нем хранятся все аргументы, переданные при вызове функции.

3. К аргументам можно обращаться по индексам: arguments[0], arguments[1] и так далее.

4. arguments похож на массив, но не является массивом.

5. У стрелочных функций нет своего arguments.

6. В новом коде чаще используют rest parameters.