Проверка на ноль / неопределенность в JavaScript - PullRequest
8 голосов
/ 05 декабря 2010

Может этот код

if (typeof foo != "undefined" && foo !== null) { }  

безопасно сменить код в этом коде?

if (foo != null) { }

Это то же самое? (А если нет, то чем он отличается?)

Ответы [ 3 ]

11 голосов
/ 05 декабря 2010

Не совсем.Вы получите исключение ReferenceError во втором примере, если foo не было объявлено.

С другой стороны, вы можете безопасно проверить неопределенные не объявленные переменныес оператором typeof.

2 голосов
/ 05 декабря 2010

Переменные могут фактически содержать значение undefined, которое является значением по умолчанию, если переменная никогда не назначалась.Таким образом, foo != null будет работать, если ваша переменная объявлена ​​с использованием var или ей присвоено значение посредством присваивания, но если это не так, вы получите ReferenceError.Таким образом, эти два фрагмента не эквивалентны.

Если вы можете быть уверены, что объявлено foo, это безопаснее и проще для понимания, чем ваш оригинальный второй фрагмент, при условии, что нигде вкод что-то вроде undefined = 42 существует:

if(foo !== undefined && foo !== null) { }
2 голосов
/ 05 декабря 2010

Простой эксперимент ответит на этот вопрос:

if( foo != null ) {
   alert('foo not null');
}

приведенный выше пример выдает ошибку javascript во многих браузерах: "ReferenceError: Can't find variable: foo".Это связано с тем, что мы использовали переменную, которая ранее не была объявлена ​​в качестве аргумента или var в текущей области.

оператор typeof, с другой стороны, создает явное согласование для переменных, которыене был определен - он возвращает 'undefined', поэтому:

if( typeof foo != 'undefined') {
    alert('foo is not defined');
}

работает как положено.

Таким образом, ответ «нет» - они не одно и то же -- хотя в некоторых средах javascript они могут вести себя одинаково, в других средах ваша вторая форма будет выдавать ошибки, если foo не определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...