Я думаю, що найефективніший спосіб перевірити на "значення є null
чи undefined
" є
if ( some_variable == null ){
// some_variable is either null or undefined
}
Отже, ці два рядки рівнозначні:
if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Примітка 1
Як було зазначено в питанні, короткий варіант вимагає, щоб some_variable
це було оголошено, інакше буде викинуто ReferenceError. Однак у багатьох випадках використання можна припустити, що це безпечно:
перевірити наявність необов'язкових аргументів:
function(foo){
if( foo == null ) {...}
перевірити властивості існуючого об'єкта
if(my_obj.foo == null) {...}
З іншого боку, typeof
можна мати справу з недекларованими глобальними змінними (просто повертається undefined
). Але, як пояснив Альссенде, ці випадки слід звести до мінімуму з поважних причин.
Примітка 2
Цей - ще коротший - варіант не рівнозначний:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
тому
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Примітка 3
Взагалі рекомендується використовувати ===
замість ==
. Пропоноване рішення є винятком із цього правила. Перевірки синтаксису JSHint навіть надає eqnull
опцію з цієї причини.
З посібника зі стилю jQuery :
Суворі перевірки рівності (===) повинні використовуватися на користь ==. Єдиний виняток - це при перевірці на невизначеність та null шляхом null.
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
if(some_variable) { ... }
не виконується, якщоsome_variable
єfalse
або0
...