Learn JavaScript

length - свойство с количеством параметров функции в JavaScript

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.