Дополнительные параметры в JavaScript
Вопрос
Каков хороший способ присвоить значение по умолчанию необязательному параметру?
Фон
Я играю с дополнительными параметрами в JavaScript и идею присвоить значение по умолчанию, если параметр не указан. Мой метод, о котором идет речь, принимает два параметра, последний из которых я считаю необязательным, а если неопределенный, должен иметь значение false
. Мой метод выглядит примерно так:
// selects the item, appropriately updating any siblings
// item to select [, toggle on / off]
this.selectItem = function(item, toggle)
{
toggle = toggle && typeof toggle === 'boolean';
if (toggle)
{
// ...
}
}
Тестирование
После запуска нескольких тестов на этот jsFiddle, используя следующую директиву для присвоения значения по умолчанию:
function checkParamIsBoolean(param)
{
param = param && typeof param === 'boolean';
}
checkParamIsBoolean('me'); // boolean
checkParamIsBoolean([]); // boolean
checkParamIsBoolean(true); // boolean
checkParamIsBoolean(false); // boolean
checkParamIsBoolean(1 == 1); // boolean
checkParamIsBoolean(1); // boolean
checkParamIsBoolean(null); // object
checkParamIsBoolean(undefined); // undefined
Как вы можете, результаты меняются и не желательны.
Ожидаемые
null
= false
undefined
= false
Фактические
null
= object
undefined
= undefined
Резюме
Существуют ли альтернативные подходы к присвоению значения по умолчанию необязательному параметру, если он не указан; было бы лучше использовать _toggle
в качестве параметра, а затем назначить значение var toggle
внутри метода?
Ответы
Ответ 1
Лучшее решение - использовать именованные аргументы, скрещенные с объектом. Он сохраняет ваш код в чистоте и предотвращает ошибки в случае сложных функций (со многими аргументами по умолчанию и не по умолчанию). В противном случае вам нужно помнить о порядке аргументов и присваивать значения по умолчанию на основе типов присутствующих аргументов (что вы пытаетесь сделать).
Этот метод является основным способом передачи параметров jQuery и jQuery плагинов.
function test(options) {
// set up default options
var defaults = {
param1: 'test',
param2: 100
};
// combine options with default values
var options = $.extend({}, defaults, options); // If you're not using jQuery you need different function here
alert(options.param1)
alert(options.param2)
}
test({'param2': 200}) // Call the function with just the second param
Ответ 2
Вы можете использовать эту конструкцию для необязательных параметров в вашем коде:
//...
optionalParam = optionalParam || 'some default value';
В вашем конкретном элементе это будет примерно так:
this.selectItem = function(item, toggle)
{
toggle = toggle || false;
// ...
}
Но в вашем случае вы можете использовать toogle (необязательный параметр) непосредственно в операторе if (поскольку вы хотите только проверить его существование). Или, возможно, вы можете использовать логическое значение, подобное этому toogle = !!toogle
(двойное отрицание).
Ответ 3
Очень простой способ проверить, является ли toggle undefined, и если после этого установлено значение по умолчанию:
if (toggle === undefined) toggle = "<your default value>";
Обратите внимание, что это не меняет toggle
, если оно указано, но другого типа, чем ожидалось.
Ответ 4
Попробуйте наоборот:
param = typeof param === 'boolean' && param;
Это приведет к тому, что все будут логическими, см. эту скрипту
Ответ 5
Почему вы проверяете значение параметра boolean, если вы ожидаете другого результата? Обычным способом будет проверка на typeof toggle != "undefined"
, но в вашем случае
toggle = Boolean(toggle);
должен выполнить задачу. Вы также можете использовать ярлык !!toggle
или использовать его непосредственно в условии if:
if (toggle) { // will evaluate to "false" for undefined
...
BTW, нет необходимости в параметре _toggle
; вы можете просто переназначить toggle
.
Ответ 6
Вы можете заменить
param = param && typeof param === 'boolean';
с
param = !!(param && typeof param === 'boolean');
Это преобразует результат инструкции в логическое отрицание, а затем отменит его обратно.
Ответ 7
Если вы считаете null
(а также не переданы аргументы), undefined
и ""
(пустая строка) как "не переданный аргумент моей функции", используйте этот оператор
toggle = toggle&&toggle||default_value
Теперь, если вы передадите null
, undefined
или ""
в свою функцию как toggle
arg, эта строка заполняет ее default_value
.
Ответ 8
Посмотрите jQuery ext и как они обрабатывают необязательные параметры.
Ответ 9
Это можно легко сделать с помощью ArgueJS:
this.selectItem = function()
{
arguments = __({item: undefined, toggle: [Boolean, false})
if (arguments.toggle)
{
// ...
}
}
Вы также можете проверить тип item
, изменив undefined
на нужный тип.