Что такое псевдомассив arguments в JavaScript?

«Что такое псевдомассив arguments в JavaScript?» — вопрос из категории JavaScript, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

arguments — это устаревший объект, доступный внутри обычных (не стрелочных) функций в JavaScript, который содержит все аргументы, переданные при вызове функции, даже если они не объявлены в её параметрах.

С точки зрения QA-инженера, работающего с автотестами, важно понимать его особенности, чтобы анализировать чужой код или писать корректные тесты для функций, которые его используют.

Ключевые особенности arguments:

  • Псевдомассив: Имеет свойство length и доступ к элементам по индексу (arguments[0]), но не имеет методов массива (forEach, map, filter).
  • Только для обычных функций: В стрелочных функциях arguments ссылается на arguments внешней функции.
  • Устарел: В современном JS вместо arguments рекомендуется использовать rest-параметры (...args).

Пример функции с arguments и её тестирование:

// Код приложения (legacy)
function sumAll() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

// Автотест для этой функции (например, с использованием Jest)
test('sumAll should correctly sum any number of arguments', () => {
  expect(sumAll(1, 2)).toBe(3);
  expect(sumAll(5, 10, 15, 20)).toBe(50);
  expect(sumAll()).toBe(0); // Важный граничный случай: нет аргументов
});

Современная альтернатива — Rest-параметры:

// Современный код, который проще тестировать
const sumAllModern = (...args) => {
  return args.reduce((accumulator, current) => accumulator + current, 0);
};
// Тест остаётся идентичным, что демонстрирует важность тестирования через публичный интерфейс.

Вывод для QA: При написании или ревью автотестов на JavaScript обращайте внимание на использование arguments в коде продукта, так как это может влиять на поведение функции, особенно в граничных случаях (ноль аргументов, большое количество аргументов).