Как проверить 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 ответов
вы должны различать два случая:
-
неопределено переменные , как
foo
. Вы получите ошибку, если получите доступ к неопределенной переменной в любом контексте, кромеtypeof
.if(typeof someUndefVar == whatever) // works if(someUndefVar) // throws error
Итак, для переменных
typeof
регистрация является обязательным. С другой стороны, это только редко - обычно знаю если ваши переменные определены или нет. -
неопределено свойства , как
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');
в новых стандартах 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');
}
нет
открыть инструменты разработчика в вашем браузере и просто попробовать код, показанный на рисунке ниже.
тестирование ничтожности (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 и "(пустая строка также). Вы можете напрямую проверить это на консоли разработчика.
вы можете видеть, что все преобразуются в 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)
}