Проверка отсутствующего параметра в функции
Правильно ли это проверить недостающий параметр в функции? Будет ли это работать во всех браузерах? Как насчет IE?
function getName(name){
name = name != null ? name : "default";
return name;
}
Ответы
Ответ 1
вы можете сделать:
name = name || 'default';
Это означает, что если name
undefined или фальшивость (null
, 0
, ""
, false
, {}
, []
), установите его на "default"
.
js (h | l) int будет жаловаться на него, но он работает хотя бы до IE7. Это не недопустимый код вообще или полагающийся на некоторые недокументированные действия.
Ответ 2
Способ проверки параметров зависит от того, какой тип информации вы передаете функции, и как вы хотите, чтобы ваша функция обрабатывала граничные случаи.
В большинстве случаев вы можете просто использовать:
function foo(bar) {
bar = bar || ...default value here...;
}
Однако это может быть проблемой, если ваш код выглядит следующим образом:
function foo(bar) {
bar = bar || 5;
alert(bar);
}
foo(0); //alerts 5, probably not what you wanted
Поэтому вместо этого вы обычно можете проверить undefined
:
function foo(bar) {
if (bar == undefined) {
bar = ...default value...
}
}
... однако использование свободной проверки позволяет перезаписать null
и undefined
(null == undefined
):
function foo(bar) {
if (bar == undefined) {
bar = 0;
}
alert(bar);
}
foo(); //alerts 0
foo(null); //alerts 0
Поэтому вместо этого обычно предпочтительным является строгое сравнение равенства (===
) (null !== undefined
):
function foo(bar) {
//if you're worried that undefined may be overwritten for any horrible reason
//use `typeof bar === 'undefined'` instead
if (bar === undefined) {
bar = ...default value...
}
}
Однако это может привести к проблемам, если вам нужно знать, прошел ли undefined
в качестве параметра:
function foo(bar) {
if (bar === undefined) {
bar = 0;
}
alert(bar);
}
foo(undefined); //alerts 0, which may or may not be desired
Если вы хотите быть абсолютно уверены, что вы не передадите аргумент, который был предоставлен, вы можете проверить количество аргументов, переданных функции:
function foo(bar) {
if (arguments.length < 1) {
bar = ...default value...;
}
}
Это означает, что вы можете успешно передать undefined
в качестве аргумента, а также выбрать другой вариант по умолчанию:
function foo(bar) {
if (arguments.length < 1) {
bar = 0;
}
alert(bar);
}
foo(undefined); //alerts undefined
foo(); //alerts 0
Если у вас несколько параметров, вы можете использовать несколько значений по умолчанию. Недавно я нашел вариант использования провала в инструкции switch, хотя утилита сомнительна:
function foo(bar, baz, fizz, buzz) {
switch (arguments.length) {
case 0:
bar = 1;
//continue; might as well point out that implicit fall-through is desired
case 1:
baz = 2;
//continue;
case 2:
fizz = 3;
//continue;
case 3:
buzz = 4;
//continue;
}
...code...
}
Ответ 3
Правильный способ проверки -
if (typeof name === "undefined") {
// ...
}
Конечно, абоненты могут "обмануть" вас, вызвав getName(undefined)
, когда параметр был предоставлен, но проверка будет отмечать его как не предоставленную, тем не менее. Но это действительно патологический сценарий.
Ответ 4
Да, это будет работать во всех браузерах, но если вы хотите узнать, может ли он быть определен, вы можете использовать:
function getName(name){
name = typeof(name) !== "undefined" ? name : "default";
return name;
}