Как узнать фактически переданное количество аргументов в функцию в JavaScript
Что проверяют
Различает ли кандидат объявленные параметры и фактически переданные аргументы, и знает ли современную замену объекту arguments.
Как отвечать
Фактическое число аргументов внутри обычной функции даёт arguments.length:
function f() {
return arguments.length;
}
f(1, 2, 3); // 3
f(); // 0Современный способ, rest-параметр, даёт настоящий массив:
function f(...args) {
return args.length;
}Дальше важны различия, ради которых вопрос и задают.
argumentsсуществует только у обычных функций и методов. У стрелочных своегоargumentsнет: обращение внутри стрелки уходит к внешней обычной функции, а если её нет, получится ошибка.argumentsэто массивоподобный объект, а не массив: естьlengthи индексы, нетmap,filter,slice. Приводится черезArray.from(arguments)или[...arguments].fn.lengthэто совсем другое число: количество объявленных параметров до первого параметра со значением по умолчанию. Rest-параметр в него не входит.
function g(a, b = 1, ...rest) {}
g.length; // 1- В нестрогом режиме
argumentsсвязан с именованными параметрами: присваивание вaменяетarguments[0]и наоборот. В строгом режиме, а также в любой функции с параметрами по умолчанию, деструктуризацией или rest, эта связь отсутствует. - Явно переданный
undefinedсчитается аргументом:f(undefined)вернёт1, а не0. Отличить «не передали» от «передали undefined» можно только поarguments.lengthили длине массива rest-параметров.
В новом коде используют rest-параметры: они работают в стрелках, дают обычный массив и видны прямо в сигнатуре функции. arguments остаётся для чтения старого кода и редких случаев, когда сигнатуру трогать нельзя.
Где спотыкаются
Путают fn.length с числом переданных аргументов и уверенно вызывают arguments.map, хотя это не массив. Третья классика: ждать работающий arguments внутри стрелочной функции.