← Назад к вопросам

Как узнать длину аргументов у функции в JavaScript?

2.0 Middle🔥 191 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как узнать длину аргументов у функции в JavaScript?

В JavaScript существует несколько способов узнать количество или "длину" аргументов, передаваемых в функцию. Это зависит от того, работаем мы с объявленными параметрами функции или с фактически переданными аргументами во время вызова. Концепция разделения этих двух сущностей является ключевой для понимания вопроса.

1. Количество объявленных параметров функции (function.length)

Свойство length функции возвращает количество параметров, указанных в её формальном объявлении. Это предопределённое свойство любого объекта Function.

function example(a, b, c, d) {
    // объявлено 4 параметра
}
console.log(example.length); // Вывод: 4

Это свойство статическое и зависит только от определения функции, а не от фактического вызова.

  • Работает для обычных объявлений функций (function) и конструкторов.
  • Работает для объявлений стрелочных функций, если они не используют параметры по умолчанию или деструктуризацию в особых случаях.
  • Не работает для функций, использующих оператор ... (rest parameters), потому что он представляет неограниченное количество аргументов. В этом случае length возвращает количество параметров до rest parameter.
function withRest(a, b, ...rest) {
    // rest собирает все остальные аргументы
}
console.log(withRest.length); // Вывод: 2 (параметры a и b до rest)

function arrow(a, b = 10) {
    // параметр со значением по умолчанию
}
console.log(arrow.length); // Вывод: 1 (b со значением по умолчанию не учитывается!)

2. Количество фактически переданных аргументов (использование arguments или rest parameters)

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

A. Устаревший объект arguments

Внутри функции (кроме стрелочных функций) доступен специальный, устаревший, но пока ещё поддерживаемый объект arguments. Это массивоподобный объект (имеет свойство length и индексы, но не является настоящим массивом), который содержит все аргументы, переданные при вызове.

function checkArgs(a, b) {
    console.log('Объявлено параметров:', checkArgs.length); // 2
    console.log('Фактически передано аргументов:', arguments.length); // может быть 0, 1, 2, 3, 100...
    console.log('Первый аргумент:', arguments[0]);
}
checkArgs(10);          // arguments.length = 1
checkArgs(10, 20, 30);  // arguments.length =数为3

Важные особенности arguments:

  • Не работает в стрелочных функциях — они не имеют своего объекта arguments. В них будет использоваться arguments из окружающей обычной функции (если есть).
  • Связь с параметрами — в старом режиме (без use strict) изменение arguments[i] могло менять значение соответствующего параметра, и наоборот. В строгом режиме эта связь разрывается.
  • Не является Array — у него нет методов map, filter, reduce. Чтобы преобразовать в массив, можно использовать Array.from(arguments) или [...arguments].

B. Современный оператор ... (Rest Parameters)

Современный и рекомендуемый способ собрать все фактические аргументы — использовать rest parameter (остаточные параметры) в объявлении функции. Он собирает "остаток" аргументов в настоящий массив.

function modernFunc(a, b, ...theRestArgsArray) {
    console.log('Объявлено параметров до rest:', modernFunc.length); // 2
    console.log('Фактически передано всех аргументов:', a, b, ...theRestArgsArray); // логика зависит от реализации
    console.log('Количество дополнительных аргументов (в rest):', theRestArgsArray.length);
    // theRestArgsArray — это уже настоящий массив!
}
modernFunc(1, 2);          // theRestArgsArray.length = 0
modernFunc(1, 2, 3, 4, 5); // theRestArgsArray.length = 3

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

function countAllArgs(first, second, ...rest) {
    const totalArgsCount = 2 + rest.length; // 2 известных параметра + все остальные
    console.log(`Всего передано аргументов: ${totalArgsCount}`);
    return totalArgsCount;
}

Сравнение подходов и выводы

Критерийfunction.lengtharguments.lengthRest Parameters
Что измеряетЧисло объявленных параметровЧисло фактически переданных аргументовЧисло аргументов, попавших в rest (часть от общего)
Тип значенияЧислоЧислоЧисло (длина массива)
ОбъектСвойство функцииМассивоподобный объект внутри функцииНастоящий массив
ПоддержкаВсе функцииНе стрелочные функции, считается устаревшимВсе современные функции, рекомендованный способ
ГибкостьСтатична, не зависит от вызоваДинамична, отражает конкретный вызовДинамична, но требует явного объявления

Итог: Если вам нужно знать, сколько параметров функция ожидает — используйте function.length. Если вам нужно узнать, сколько аргументов ей фактически передали в данном вызове — внутри обычной функции (не стрелочной) вы можете использовать arguments.length, но современный и более безопасный способ — объявить функцию с rest parameter (...args) и затем работать с args.length. Для получения общего количества всех переданных аргументов при использовании rest параметров необходимо выполнить простую арифметическую операцию: сложить количество явно объявленных параметров и длину rest-массива.

Как узнать длину аргументов у функции в JavaScript? | PrepBro