Правильно ли это проверить недостающий параметр в функции? Будет ли это работать во всех браузерах? Как насчет IE?
function getName(name){
name = name != null ? name : "default";
return name;
}
Правильно ли это проверить недостающий параметр в функции? Будет ли это работать во всех браузерах? Как насчет IE?
function getName(name){
name = name != null ? name : "default";
return name;
}
вы можете сделать:
name = name || 'default';
Это означает, что если name
undefined или фальшивость (null
, 0
, ""
, false
, {}
, []
), установите его на "default"
.
js (h | l) int будет жаловаться на него, но он работает хотя бы до IE7. Это не недопустимый код вообще или полагающийся на некоторые недокументированные действия.
Способ проверки параметров зависит от того, какой тип информации вы передаете функции, и как вы хотите, чтобы ваша функция обрабатывала граничные случаи.
В большинстве случаев вы можете просто использовать:
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...
}
Правильный способ проверки -
if (typeof name === "undefined") {
// ...
}
Конечно, абоненты могут "обмануть" вас, вызвав getName(undefined)
, когда параметр был предоставлен, но проверка будет отмечать его как не предоставленную, тем не менее. Но это действительно патологический сценарий.
Да, это будет работать во всех браузерах, но если вы хотите узнать, может ли он быть определен, вы можете использовать:
function getName(name){
name = typeof(name) !== "undefined" ? name : "default";
return name;
}