Подтвердить что ты не робот

Проверка отсутствующего параметра в функции

Правильно ли это проверить недостающий параметр в функции? Будет ли это работать во всех браузерах? Как насчет IE?

function getName(name){
    name = name != null ? name : "default";
    return name;
}
4b9b3361

Ответ 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;
}