> Как узнать фактически переданное количество аргументов в функцию в JavaScript (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: Домклик, Яндекс

Стек: JavaScript

> Пример ответа

Короткий ответ

Фактическое количество переданных аргументов в функцию в JavaScript можно узнать через псевдомассив arguments (доступен внутри обычных функций) или через rest-параметр ...args. arguments.length возвращает число переданных аргументов, независимо от объявленных параметров. В стрелочных функциях arguments не работает, поэтому используется rest-параметр.

Подробное объяснение

В JavaScript функции могут принимать любое количество аргументов, даже если объявлено меньше параметров. Для получения фактического числа переданных аргументов есть два основных подхода:

  1. Псевдомассив arguments - встроенный объект, доступный внутри всех обычных (не стрелочных) функций. Содержит все переданные аргументы по индексам. Свойство arguments.length показывает их количество. Это псевдомассив: у него есть length и индексы, но нет методов массива (например, forEach).

  2. Rest-параметр ...args - синтаксис ES6, собирает оставшиеся аргументы в настоящий массив. Работает в любых функциях, включая стрелочные. args.length даёт количество аргументов.

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

На практике

Используйте arguments в старом коде или когда нужно поддерживать ES5. В современном JavaScript предпочтительнее rest-параметр - он даёт настоящий массив и работает в стрелочных функциях. Rest-параметр также делает код более читаемым и предсказуемым.

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

Пример кода

JAVASCRIPT
// Через arguments (обычная функция)
function logArgs() {
console.log('Передано аргументов:', arguments.length);
for (let i = 0; i < arguments.length; i++) {
console.log(`Аргумент ${i}:`, arguments[i]);
}
}
logArgs(1, 'hello', true); // Передано аргументов: 3
// Через rest-параметр (работает и в стрелочных функциях)
const logArgsRest = (...args) => {
console.log('Передано аргументов:', args.length);
args.forEach((arg, index) => console.log(`Аргумент ${index}:`, arg));
};
logArgsRest(42, 'world', false); // Передано аргументов: 3
// Пример с именованными параметрами
function showInfo(name, ...otherInfo) {
console.log('Имя:', name);
console.log('Дополнительных аргументов:', otherInfo.length);
}
showInfo('Анна', 25, 'Москва', 'developer'); // Дополнительных аргументов: 3

Как отвечать на собеседовании

Начните с прямого ответа: arguments.length или args.length для rest-параметра. Объясните разницу между подходами: arguments - псевдомассив, доступен только в обычных функциях; rest-параметр - настоящий массив, универсален. Упомяните, что стрелочные функции не имеют arguments. Приведите простой пример. Если спросят про производительность - rest-параметр чуть медленнее из-за создания массива, но разница незначительна.

Что проверяет интервьюер

  • Понимание разницы между arguments и rest-параметром.
  • Знание ограничений arguments (псевдомассив, не работает в стрелочных функциях).
  • Умение работать с переменным количеством аргументов.
  • Осведомлённость о современном синтаксисе ES6+.

Типичные ошибки

  • Попытка использовать arguments в стрелочной функции - это вызовет ReferenceError.
  • Путаница между arguments.length (количество переданных аргументов) и function.length (количество объявленных параметров).
  • Забывают, что arguments - не массив, и пытаются вызвать на нём методы массива без преобразования.
  • Использование rest-параметра не последним в списке параметров - синтаксическая ошибка.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью