Аргументы функции по умолчанию в JavaScript
Общие моменты
Когда число аргументов в вызове функции меньше числа объявленных параметров, недостающие аргументы получают значение undefined
:
function optional(d) { "undefined" === typeof d && (d = 0); }
Другой способ:
function optional(d) { d = d || 0; }
Если число аргументов в вызове функции превышает число имен параметров, функция не может напрямую обратиться к неименованным значениям. На помощь приходит объект Arguments
. В теле функции «переменная» arguments
ссылается на объект Arguments
, присутствующий в вызове. Объект Arguments
позволяет извлекать переданные функции значения по их индексам, а не по именам:
function optional(d) { console.log(arguments.length); }
Практическое применение переменного числа аргументов функции, поиск наибольшего значения:
function maxNumber() { var m = Number.NEGATIVE_INFINITY; for(var i = 0; i < arguments.length; i++) if (arguments[i] > m) m = arguments[i]; return m; } var largest = maxNumber(1, 10, 100, 2, 3, 1000, 4, 5, 10000, 6); // 10000
arguments
является обычным объектом Javascript:
Object.getPrototypeOf(arguments) == Object.prototype
Превратить его в массив можно так:
var args = Array.prototype.slice.call(arguments, 0);
Содержимое arguments
arguments.length
— количество аргументов, переданных в функцию.
arguments.callee
— ссылка на функцию в контексте которой создан arguments
:
function func() { console.log(arguments.callee === func); // true }
Так можно проверить, передано ли правильное количество элементов, или нет:
function func(foo, bar, qux) { return arguments.callee.length === arguments.length; }
Кстати, у каждой функции тоже есть свойство length
, которое указывает на количество элементов объявленных в её заголовке:
function func(foo) {}; console.log(func.length); // 1
Для упрощения работы с аргументами есть библиотека, позволяющая контролировать число входящих аргументов, соответствие типам, управлять значениями по умолчанию и т.д.