Этот вопрос проверяет знание способов определения количества аргументов, ожидаемых функцией, что важно для метапрограммирования, валидации и создания гибких API.
В JavaScript функция является объектом и имеет встроенное свойство length, которое указывает на количество параметров, ожидаемых при её объявлении. Это значение, известное как "арность" (arity) функции, полезно для метапрограммирования, например, при создании декораторов, каррирования или валидации вызовов.
Свойство length возвращает количество параметров, указанных в сигнатуре функции до первого параметра со значением по умолчанию или остаточного параметра (...rest). Например:
function sum(a, b, c) {
return a + b + c;
}
console.log(sum.length); // 3
function greet(name, greeting = 'Hello') {
return `${greeting}, ${name}!`;
}
console.log(greet.length); // 1 (параметры после значения по умолчанию не считаются)
function logAll(...args) {
console.log(args);
}
console.log(logAll.length); // 0 (остаточный параметр не учитывается)Внутри функции можно узнать, сколько аргументов было фактически передано при вызове, используя псевдомассив arguments (в обычных функциях) или параметр ...rest (в стрелочных и современных функциях). Например:
function example(x, y) {
console.log('Ожидалось:', example.length); // 2
console.log('Передано:', arguments.length); // Может быть 0, 1, 2 или больше
}
example(10); // Ожидалось: 2, Передано: 1
const arrow = (...params) => {
console.log('Передано аргументов:', params.length);
};
arrow(1, 2, 3); // Передано аргументов: 3Определение длины функции используется в различных сценариях:
length, чтобы знать, когда функция полностью применена.// Пример: декоратор для логирования арности
function logArity(fn) {
console.log(`Функция ${fn.name} ожидает ${fn.length} аргумент(ов)`);
return fn;
}
const add = logArity((a, b) => a + b);
// В консоли: "Функция add ожидает 2 аргумент(ов)"Вывод: Используйте function.length, когда нужно узнать ожидаемое количество параметров функции для метапрограммирования или интроспекции, а arguments.length или ...rest — для работы с фактически переданными аргументами внутри функции. Это особенно полезно при создании библиотек, утилит или фреймворков, где требуется адаптивность к сигнатурам функций.