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

时间:2010-04-01 09:17:19

标签: javascript null undefined

我们经常在JavaScript代码中使用以下代码模式

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

是否有一种不那么冗长的检查方式具有相同的效果?

根据一些论坛和文献说,以下内容应该具有相同的效果。

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

不幸的是,Firebugsome_variable未定义的情况下将这样的语句评估为运行时错误,而第一个语句就好了。这只是Firebug的一个(不需要的)行为,还是这两种方式之间确实存在一些差异?

24 个答案:

答案 0 :(得分:373)

我认为测试“价值为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 syntax checker甚至提供eqnull选项。

来自jQuery style guide

  

应使用严格的等式检查(===)以支持==。唯一的   异常是通过null检查undefined和null。

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

答案 1 :(得分:310)

您必须区分两种情况:

  1. 未定义的变量,例如foo。如果在typeof以外的任何上下文中访问未定义的变量,则会出现错误。

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

    因此,对于变量,typeof检查是必须的。另一方面,它很少需要 - 如果你的变量被定义,你通常知道

  2. 未定义的属性,例如someExistingObj.someUndefProperty。未定义的属性不会产生错误,只返回undefined,当转换为布尔值时,它将计算为false。所以,如果你不在乎 使用0 falseif(obj.undefProp)即可。基于这个事实有一个共同的习语:

    value = obj.prop || defaultValue
    

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

    有些人认为这种行为令人困惑,认为这会导致难以发现的错误并建议使用in运算符

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

答案 2 :(得分:57)

使用正常相等性检查null也将为undefined返回true。

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

JS Equality

答案 3 :(得分:27)

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

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

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

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

此处“null”或“空字符串”或“未定义”将得到有效处理。

答案 4 :(得分:20)

如果您尝试引用未声明的变量,则会在所有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的重复使用。

答案 5 :(得分:15)

首先,您必须非常清楚自己测试的内容。 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 entry to compare the correctness and performance这些方法。由于在不同的浏览器/平台上没有足够的运行,因此结果目前尚无定论。请花一点时间在您的计算机上运行测试!

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

答案 6 :(得分:5)

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

一般来说,表达式为:

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

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

如果variable 全球,您可以简化为:

if (window.variable != null)

如果是本地,您可以避免此变量未声明的情况,并简化为:

if (variable != null)

如果是对象属性,则不必担心ReferenceError:

if (obj.property != null)

答案 7 :(得分:5)

这是一个极少数情况下的示例,建议使用==而不是===。表达式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 },
]);

答案 8 :(得分:5)

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

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

}

如果您不知道变量是否存在(即,如果已声明),则应使用typeof运算符进行检查。 e.g。

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

答案 9 :(得分:4)

我已经使用这种方法完成了

将ID保存在某个变量中

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

然后使用if条件

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

答案 10 :(得分:3)

正如其中一个答案中所提到的,如果您正在讨论具有全局范围的变量,那么您可以很幸运。您可能知道,您全局定义的变量往往会添加到Windows对象中。你可以利用这个事实,所以假设你正在访问一个名为bleh的变量,只需使用双反转算子(!!)

!!window['bleh'];

如果未声明bleh并且已赋值,则返回false。

答案 11 :(得分:2)

无论 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');
}

没有

答案 12 :(得分:2)

这是唯一应使用-r96的情况:

==

答案 13 :(得分:2)

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

enter image description here

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

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

我还要指出一件事。

布尔值(0)的结果是什么?

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

答案 14 :(得分:2)

在浏览器中打开开发者工具,然后尝试下图中显示的代码。

Img1 Img2

答案 15 :(得分:1)

这是使用数组includes()方法的另一种方法:

[undefined, null].includes(value)

答案 16 :(得分:0)

使用严格比较运算符可以轻松区分这两个值:

工作示例:

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.");
    }   
}

答案 17 :(得分:0)

测试nullity(if (value == null))或非nullity(if (value != null))比测试变量的定义状态更简洁。

此外,如果使用布尔if (value)值定义,则测试if( obj.property)(或false)以确保变量(或对象属性)的存在失败。注意事项:)

答案 18 :(得分:0)

类似于您所拥有的,您可以做类似的事情

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

答案 19 :(得分:0)

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

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

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

答案 20 :(得分:0)

如果if语句的目的是在将值赋给变量之前检查nullundefined值,则可以使用Nullish Coalescing Operator,最终可在JavaScript,尽管浏览器支持有限。根据{{​​3}}的数据,截至2020年4月,仅支持48.34%的浏览器。

const a = some_variable ?? '';

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

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

答案 21 :(得分:0)

将未定义或null或0与ES5和ES6标准进行比较的最佳方法

 if ((Boolean(some_variable_1) && Boolean(some_variable_2)) === false) {
    // do something
    }

答案 22 :(得分:-1)

有了Ramda,您只需完成R.isNil(yourValue) Lodash和其他帮助程序库具有相同的功能。

答案 23 :(得分:-1)

您必须定义此表单的函数:

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