Как проверить undefined или null переменной в JavaScript?

мы часто используем следующий шаблон кода в нашем коде JavaScript

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

есть ли менее трудоемкий способ проверки, который имеет тот же эффект?

согласно некоторым форумам и литературе, просто следующее должно иметь тот же эффект.

if (some_variable)
{
    // Do something with some_variable
}

к сожалению, Firebug оценивает такое утверждение как ошибка во время выполнения, когда some_variable не определено, в то время как первый просто отлично подходит для него. Это только (нежелательного) поведения Firebug или действительно есть какая-то разница между этими двумя вариантами?

15 ответов


вы должны различать два случая:

  1. неопределено переменные , как foo. Вы получите ошибку, если получите доступ к неопределенной переменной в любом контексте, кроме typeof.

    if(typeof someUndefVar == whatever) // works
    
    if(someUndefVar) // throws error  
    

    Итак, для переменных typeof регистрация является обязательным. С другой стороны, это только редко - обычно знаю если ваши переменные определены или нет.

  2. неопределено свойства , как someExistingObj.someUndefProperty. Неопределенное свойство не дает ошибки и просто возвращает undefined, который, когда преобразовано в булево, значение false. Так что, если тебе все равно ... 0 и false, используя if(obj.undefProp) ОК. Существует общая идиома, основанная на этом факте:

    value = obj.prop || defaultValue
    

    что значит "если obj свойство prop, назначить value, в противном случае присвоить значение по умолчанию defautValue".

    некоторые люди считают это поведение сбивает с толку, утверждая, что это приводит к труднодоступным ошибкам и рекомендует использовать in оператор вместо

    value = ('prop' in obj) ? obj.prop : defaultValue
    

Я думаю, что самый эффективный способ проверить "значение 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

вообще рекомендуется использовать === вместо ==. Предлагаемое решение является исключением из этого правила. The проверка синтаксиса JSHint даже предоставляет eqnull вариант по этой причине.

С руководство по стилю jQuery:

строгие проверки равенства ( = = = ) должны использоваться в пользу ==. Этот только исключение - при проверке на неопределенный и null через null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

проверка null с нормальным равенством также вернет true для undefined.

if (window.variable == null) alert('variable is null or undefined');

JS Equality


в новых стандартах JavaScript, таких как ES5 и ES6, вы можете просто сказать

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

all возвращает false, что похоже на проверку пустых переменных Python. Поэтому, если вы хотите написать условную логику вокруг переменной, просто скажите

if (Boolean(myvar)){
   // Do something
}

здесь" null "или" пустая строка "или" undefined " будут обрабатываться эффективно.


если вы попытаетесь сослаться на необъявленную переменную, во всех реализациях JavaScript будет выдана ошибка.

свойства объектов не подчиняются одним и тем же условиям. Если свойство объекта не определено, при попытке доступа к нему ошибка не будет выдана. Поэтому в этой ситуации вы можете сократить:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

to

if (myObj.some_property != null)

имея это в виду, и тот факт, что глобальные переменные доступны как свойства глобального объекта (window в случае браузера), вы можете использовать следующие глобальные переменные:

if (window.some_variable != null) {
    // Do something with some_variable
}

в локальных областях всегда полезно убедиться, что переменные объявлены в верхней части блока кода, это сэкономит на повторяющемся использовании typeof.


во-первых, вы должны быть очень ясно о том, что вы испытываете. JavaScript имеет все виды неявных преобразований, чтобы запутать вас, и два разных типа компаратора равенства:== и ===.

функции test(val) что тесты null или undefined должен иметь следующие характеристики:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

давайте посмотрим, какая из идей здесь действительно проходит наш тест.

работы:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

они не работа:

typeof(val) === 'undefined'
!!val

я создал запись jsperf для сравнения правильности и производительности из этих подходов. Результаты неубедительны на данный момент, так как не было достаточно работает в разных браузерах/платформах. Пожалуйста, уделите минуту, чтобы запустить тест на вашем компьютере!

в настоящее время, кажется, что просто


поскольку нет единого полного и правильного ответа, я попытаюсь подвести итог:

в общем, выражение:

if (typeof(variable) != "undefined" && variable != null)

нельзя упростить, потому что variable может быть необъявленным, поэтому опуская typeof(variable) != "undefined" приведет к ReferenceError. Но,вы можете упростить выражение в соответствии с контекстом:

если variable is глобальные, вы можете упростить:

if (window.variable != null)

если это местные, вы, вероятно, можете избежать ситуаций, когда эта переменная не объявлена, а также упростить:

if (variable != null)

если это объект недвижимости, вам не нужно беспокоиться о ReferenceError:

if (obj.property != null)

вы можете просто проверить, имеет ли переменная значение или нет. Значит,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

Если вы не знаете, существует ли переменная (то есть, если она была объявлена), вы должны проверить с помощью оператора typeof. например,

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}

Как упоминалось в одном из ответов, вам может повезти, если вы говорите о переменной, имеющей глобальную область. Как вы знаете, переменные, которые вы определяете глобально, обычно добавляются в объект windows. Вы можете воспользоваться этим фактом, поэтому давайте скажем, что вы обращаетесь к переменной bleh, просто используйте двойной инвертированный оператор (!!)

!!window['bleh'];

это вернет false, в то время как bleh не был объявлен и присвоено значение.


все yyy не определено или null, он вернет true

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

да

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

нет


открыть инструменты разработчика в вашем браузере и просто попробовать код, показанный на рисунке ниже.

Img1 Img2


тестирование ничтожности (if (value == null)) или не-nullity (if (value != null)) является менее подробным, чем тестирование состояния определения переменной.

тестирование if (value) (или if( obj.property)) для обеспечения существования переменной (или свойства объекта) не удается, если она определена с помощью логического false значение. Предостережение emptor:)

оба значения можно легко отличить с помощью строгий оператор сравнения:

рабочий пример:

http://www.thesstech.com/tryme?filename=nullandundefined

Пример Кода:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}

чтобы понять, давайте проанализируем, каким будет значение, возвращаемое движком Javascript при преобразовании undefined, null и "(пустая строка также). Вы можете напрямую проверить это на консоли разработчика.

enter image description here

вы можете видеть, что все преобразуются в false, означает, что все эти три предполагают "отсутствие существования" javascript. Таким образом, вам не нужно явно проверять все три в вашем коде, как под.

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

также я хочу отметить еще одну вещь

каким будет результат Boolean (0)?

конечно false. Это создаст некоторую ошибку в вашем коде, когда 0 станет допустимым значением ожидаемого результата. Поэтому, пожалуйста, убедитесь, что эта вещь также, Когда вы пишете код


вы должны определить функцию в таком виде:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}