如何在JavaScript中检查未定义或null变量?


500

我们经常在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的一种(有害的)行为,还是这两种方式之间确实存在一些区别?


46
if(some_variable) { ... }如果some_variableis false0or,将不会执行
kennytm

好点;)但是可以说我知道它不能为false或0,我只想检查是否可以在某种逻辑中使用它(如字符串,数组等)
Tomas Vana 2010年


2
...或一个空字符串。
大卫

Answers:


333

您必须区分两种情况:

  1. 变量可以是undefined或未声明的。如果您在以外的任何上下文中访问未声明的变量,则会收到错误消息typeof
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

已声明但尚未初始化的变量是undefined

let foo;
if (foo) //evaluates to false because foo === undefined
  1. 未定义的属性,例如someExistingObj.someUndefProperty。未定义的属性不会产生错误,而只是返回undefined,当转换为布尔值时,其结果为false。因此,如果您不关心 0and false,则可以使用if(obj.undefProp)。基于这个事实,有一个常见的成语:

    value = obj.prop || defaultValue

    这表示“如果obj具有属性prop,请将其分配给value,否则分配默认值defautValue”。

    有些人认为此行为令人困惑,认为它会导致难以发现的错误,因此建议改用in运算符

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

1
然后,您可以讨论hasOwnProperty和原型。[]中的'indexOf'== [] .hasOwnProperty('indexOf')
Alsciende 2010年

1
是的,我考虑过添加此内容,但是为了简洁起见,决定牺牲完整性。;)
user187291 '04

52
您没有解决0和false的问题
TMS 2013年

12
您的意思是未声明的变量。可以声明变量,但值仍为undefined
Tgr 2015年

1
还要注意,它typeof返回一个字符串。因此不var myVar; typeof(myVar)==undefined返回。falsetrue
rism

417

我认为最有效的方式来测试“值nullundefined”被

if ( some_variable == null ){
  // some_variable is either null or undefined
}

因此,这两行是等效的:

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

注1

如问题中所提到的,short变体要求some_variable已声明,否则将引发ReferenceError。但是,在许多用例中,您可以假定这是安全的:

检查可选参数:

function(foo){
    if( foo == null ) {...}

检查现有对象的属性

if(my_obj.foo == null) {...}

另一方面typeof可以处理未声明的全局变量(简单地返回undefined)。正如Alsciende解释的那样,出于充分的原因,这些案例应该减少到最少。

笔记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检查undefined和null时。

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

1
非常重要的区别(问题btw中已经提到过)。这就是每个人都使用typeof的原因。抱歉,我不知道您的答案在哪里有用,您只说问题中所说的话,在头几行中甚至说错了。
TMS

33
抱歉,但我必须不同意;-)使用== nullimho是测试“空或未定义”(这是问题所在)的最有效方法。它绝非罕见(在jQuery 1.9.1中使用了43次),因为通常您会知道该变量已声明-或测试了现有对象(如)的属性if( o.foo == null)
2013年

1
@ mar10(aUndefinedVar == null)给您一个“ aUndefinedVar未定义”错误,不正确。
Rannnn

7
感谢您的简洁说明。在我的99%的代码中,无需区分null和undefined,因此,此检查的简短性使得代码更加混乱。
伊恩·洛夫乔伊

1
为了防止在检查全局变量时出现ReferenceError,请使用window.someProperty == null。对于局部变量,您可以轻松地确保已声明它们:而不是写if (...) {var local = ""}writevar local; if (...) { local = ""; }
Aloso

66

使用正常相等性检查null也会为未定义返回true。

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

JS平等


4
NaN不等于Nan?
Sharjeel Ahmed

2
@monotheist NaN不等于NaN(请参见MDN的NaN页面)。Javascript使用IEEE-754作为其浮点,以指定此行为。对此有一些想法,请参见stackoverflow.com/a/23666623/2563765
史蒂文·史蒂芬(Steven)

1
@SharjeelAhmed经过数学校正。NaN差分方程式永远无法期望相等
Thaina

28

在更新的JavaScript标准(例如ES5和ES6)中,您可以说

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

全部返回false,这类似于Python对空变量的检查。因此,如果您想围绕变量编写条件逻辑,只需说

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

在这里,“空”或“空字符串”或“未定义”将得到有效处理。


2
支持下来就像ie5,为什么这不是众所周知的!
Himmators

12
OP只是想测试null和的不同undefined,其他虚假值应该返回true!
安德烈·菲盖雷多

1
它在条件中没有任何价值。条件的计算结果完全相同,但对于0,仍返回false NaN。当您要捕获对象的真实性而又不保留对该对象的引用时,可以用它存储而不是存储一些潜在的大对象。仅供参考,这也等同于!!value,第一个!否定真实性,第二个否定真实性。
erich2k8

>仅供参考,这也等于!! value,第一个!否定真实性。 哪个FYI也等效于if (var)将转换为boolean,因此基本上完全没用...
Cyril CHAPON

2
虽然从字面上使用关键字不确定Boolean(undefined)作品,试图与一个不确定的变量 工作,那就是做对null或undefined检查整点。这:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }引发ReferenceError说“ ReferenceError:undeclareVarName未定义”
Stephen P

22

如果尝试引用未声明的变量,则所有JavaScript实现都将引发错误。

对象的属性不受相同条件的限制。如果未定义对象属性,则尝试访问它不会引发错误。因此,在这种情况下,您可以缩短:

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

if (myObj.some_property != null)

考虑到这一点,以及可以将全局变量作为全局对象的属性进行访问的事实(window对于浏览器),可以对全局变量使用以下内容:

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

在本地范围内,确保在代码块的顶部声明变量总是有用的,这将节省对的重复使用typeof


11
您会错过NaN,0,“”和false,因为它们不是null或未定义,而是false。
安德烈亚斯Köberle

@AndreasKöberle是对的。甚至非严格相等运算符都说null与NaN,0,“”和false有所不同。您必须做得到if (myObj.some_property != null)等效的行为。
thejoshwolfe 2013年

15

首先,您必须非常清楚要测试的内容。JavaScript具有各种隐式转换,可带您进入旅途,还有两种不同类型的相等比较器:=====

一个功能,test(val)该测试nullundefined应具有以下特点:

 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条目来比较这些方法的正确性和性能。暂时的结果尚无定论,因为在不同的浏览器/平台上运行次数不足。请花一点时间在计算机上运行测试!

目前,简单val == null测试似乎可以提供最佳性能。它也是最短的。val != null如果需要补充,可以否定测试。


12

这是唯一==应使用的情况:

if (val == null) console.log('val is null or undefined')

3
这个答案大约在2019年还没有得到支持,但这是针对该用例的KISS之一。同时val != null在相反的,只有一个= ,自每@Yukulele它是唯一一个使用==你会知道什么是不,当你看到它。
DKebler '19

7

由于没有一个完整而正确的答案,因此我将尝试总结一下:

通常,表达式为:

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

无法简化,因为variable可能未声明,因此省略typeof(variable) != "undefined"将导致ReferenceError。但是,您可以根据上下文简化表达式

如果variable全局,则可以简化为:

if (window.variable != null)

如果它是local,则可以避免未声明此变量的情况,并且还可以简化为:

if (variable != null)

如果它是object property,则不必担心ReferenceError:

if (obj.property != null)

是的navigator一部分window吗?当我们获得的例外时navigator is not defined,我们可以使用window.navigator != null测试吗?
jww 2015年

5

您可以只检查变量是否具有值。含义,

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
}

4

我已经用这种方法做到了

将ID保存在某个变量中

var someVariable = document.getElementById("someId");

然后使用if条件

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}

3

如答案之一所述,如果您谈论的是具有全局作用域的变量,那么可能会很幸运。如您所知,您全局定义的变量往往会添加到Windows对象中。您可以利用这个事实,所以可以说您正在访问一个名为bleh的变量,只需使用double倒数运算符(!!)

!!window['bleh'];

当尚未声明bleh并为其分配值时,这将返回false。



2

不管yyy是undefined还是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');
}

没有



2

为了理解,让我们分析一下Javascript引擎在转换undefined,null和''(也为空字符串)时返回的值。您可以直接在开发人员控制台上进行检查。

在此处输入图片说明

您可以看到所有这些都将转换为false,这意味着所有这三个都被javascript假设为“不存在”。因此,您无需像下面那样显式检查代码中的所有三个。

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

我还要指出一件事。

Boolean(0)的结果是什么?

当然是假的。当0是预期结果的有效值时,这将在您的代码中创建错误。因此,请确保在编写代码时进行检查。


2

与您拥有的类似,您可以执行类似的操作

if (some_variable === undefined || some_variable === null) { do stuff }


2

这是一个极少数情况下的示例,建议使用==代替===somevar == null对于undefinednull,表达式将返回true ,对于其他所有表达式将返回false(如果未声明变量,则返回错误)。

使用!=会按预期翻转结果。

现代编辑器不会警告对==或进行!=操作null,因为这几乎总是所需的行为。

最常见的比较:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

自己尝试:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);

0

测试null(if (value == null))或non-nullity(if (value != null))的详细程度要比测试变量的定义状态少。

此外,如果将变量(或对象属性)定义为布尔值,则进行测试if (value)(或 if( obj.property))以确保变量(或对象属性)的存在失败false。买者自负 :)



0

如果if语句的目的是在为变量赋值之前检查nullundefined值,则可以使用Nullish Coalescing Operator,尽管浏览器支持有限,但该功能最终可以在JavaScript上使用。根据caniuse的数据,仅支持48.34%的浏览器(截至2020年4月)。

const a = some_variable ?? '';

如果some_variablenull或,这将确保将变量分配给空字符串(或任何其他默认值)undefined

该运算符最适合您的用例,因为它不返回其他类型的伪造值(例如0和)的默认值''


-1

您必须定义这种形式的功能:

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

如果未声明变量,则将生成相同的ReferenceError。
乍得

-1

在ES5或ES6中,如果需要多次检查,可以执行以下操作:

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}


-1

使用R.isNil(yourValue) Ramda ,您可以简单地使Lodash和其他帮助程序库具有相同的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.