length - это свойство функции, которое показывает количество параметров, указанных в её объявлении.
Если говорить просто, length у функции показывает, сколько параметров функция ожидает по своей записи, а не сколько аргументов реально передали при вызове.
Синтаксис
Базовая запись выглядит так:
functionName.length;
Результатом будет число.
function greet(name, age) {}
console.log(greet.length); // 2
Что показывает length
Свойство length считает объявленные параметры функции.
function sum(a, b, c) {}
console.log(sum.length); // 3
Это значит, что у функции в записи указаны три параметра.
length не показывает количество переданных аргументов
Это один из самых важных моментов.
function sum(a, b) {
console.log(sum.length);
console.log(arguments.length);
}
sum(1, 2, 3);
// 2
// 3
Здесь:
sum.lengthпоказывает количество параметров в объявлении функцииarguments.lengthпоказывает количество реально переданных аргументов
То есть это разные вещи.
length у стрелочной функции
У стрелочных функций это свойство тоже есть.
const multiply = (a, b) => a * b;
console.log(multiply.length); // 2
Поэтому length относится не только к function declaration, но и к другим видам функций.
Параметры по умолчанию влияют на length
Если у параметра есть значение по умолчанию, подсчёт останавливается на первом таком параметре.
function createUser(name, role = "user", isAdmin) {}
console.log(createUser.length); // 1
Хотя параметров записано три, length здесь будет 1, потому что после первого параметра начинается параметр со значением по умолчанию.
Это важный нюанс, который легко пропустить.
Rest-параметр не входит в length
Rest-параметр через ...args не учитывается как обычный параметр.
function collect(...args) {}
console.log(collect.length); // 0
Если перед rest есть обычные параметры, они считаются.
function collectValues(first, ...others) {}
console.log(collectValues.length); // 1
Деструктуризация считается как один параметр
Если в параметрах используется деструктуризация, каждый такой параметр считается как один.
function printUser({ name }, [first, second]) {}
console.log(printUser.length); // 2
Хотя внутри параметров есть вложенная структура, для length это всё равно два параметра.
Что происходит после bind()
После bind() создаётся новая функция, и её length обычно уменьшается на количество заранее переданных аргументов.
function sum(a, b, c) {}
const bound1 = sum.bind(null);
const bound2 = sum.bind(null, 1);
const bound3 = sum.bind(null, 1, 2);
console.log(sum.length); // 3
console.log(bound1.length); // 3
console.log(bound2.length); // 2
console.log(bound3.length); // 1
Важно: переданный this сам по себе длину не уменьшает. На length влияют именно заранее подставленные аргументы.
Для чего это может быть полезно
Свойство length чаще всего используют в служебных задачах:
- для отладки
- для учебных примеров
- для анализа функций
- в обёртках и вспомогательных инструментах
Пример:
function logInfo(fn) {
console.log(`Имя: ${fn.name}`);
console.log(`Параметров: ${fn.length}`);
}
function greet(name, age) {}
logInfo(greet);
// "Имя: greet"
// "Параметров: 2"
Это полезно, когда нужно быстро понять форму функции.
length функции - это не length массива, строки или arguments
Слово length в JavaScript встречается часто, но смысл зависит от объекта.
function greet(name, age) {}
console.log(greet.length); // 2
console.log("JavaScript".length); // 10
console.log([1, 2, 3].length); // 3
Здесь одно и то же имя свойства, но смысл разный:
- у функции
length- это количество параметров - у строки
length- это длина строки - у массива
length- это количество элементов
Поэтому важно смотреть, у какого значения вы читаете это свойство.
Можно ли менять length
Обычным присваиванием - обычно нет.
function greet(name, age) {}
greet.length = 10;
console.log(greet.length); // 2
Для практики достаточно помнить: length у функции обычно читают, а не изменяют.
Когда не стоит переоценивать length
Свойство length удобно, но не стоит воспринимать его как точный ответ на вопрос “сколько аргументов нужно функции”.
Например:
function createUser(name, role = "user") {}
console.log(createUser.length); // 1
Это не значит, что у функции всего один параметр. Это значит, что по правилам length учитывается только часть параметров.
Поэтому length лучше использовать как справочную информацию о сигнатуре функции, а не как строгую бизнес-логику.
Частые ошибки
Путать function.length и arguments.length
function sum(a, b) {
console.log(sum.length);
console.log(arguments.length);
}
Это разные вещи: первое показывает параметры функции, второе - реальные аргументы вызова.
Думать, что length считает все параметры всегда
Если встретился параметр со значением по умолчанию, подсчёт меняется.
Забывать, что rest-параметр не входит в length
function collect(...args) {}
console.log(collect.length); // 0
Это нормальное поведение.
Путать length функции с length массива или строки
function greet(name) {}
console.log(greet.length); // 1
console.log([1, 2, 3].length); // 3
Свойство называется одинаково, но означает разное.
Пытаться менять length через обычное присваивание
function greet(name, age) {}
greet.length = 10;
Обычно это не меняет значение свойства.
Быстрая памятка
lengthу функции показывает количество параметров в её объявленииfunction.lengthне равно количеству реально переданных аргументовarguments.lengthиfunction.length- это разные вещи- параметры по умолчанию влияют на подсчёт
length - rest-параметр не входит в
length - деструктурированный параметр считается как один
- после
bind()длина функции может уменьшиться из-за заранее переданных аргументов lengthфункции - это не то же самое, чтоlengthстроки или массива
Коротко
length в JavaScript у функции показывает количество параметров, записанных в её объявлении. Главное, что стоит запомнить: это свойство описывает сигнатуру функции, а не реальные аргументы вызова, поэтому его особенно важно не путать с arguments.length.