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

Tom*_*ana 480 javascript null undefined

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

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}
Run Code Online (Sandbox Code Playgroud)

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

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

if (some_variable)
{
    // Do something with some_variable
}
Run Code Online (Sandbox Code Playgroud)

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

mar*_*r10 399

我认为测试"价值是nullundefined" 的最有效方法是

if ( some_variable == null ){
  // some_variable is either null or undefined
}
Run Code Online (Sandbox Code Playgroud)

所以这两行是等价的:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Run Code Online (Sandbox Code Playgroud)

注1

正如问题中所提到的,short变量要求some_variable已声明,否则将抛出ReferenceError.但是在许多用例中,您可以认为这是安全的:

检查可选参数:

function(foo){
    if( foo == null ) {...}
Run Code Online (Sandbox Code Playgroud)

检查现有对象的属性

if(my_obj.foo == null) {...}
Run Code Online (Sandbox Code Playgroud)

另一方面typeof可以处理未声明的全局变量(简单地返回undefined).然而,正如Alsciende所解释的那样,这些案例应该有充分的理由减少到最低限度.

笔记2

这个 - 甚至更短 - 变体等同于:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}
Run Code Online (Sandbox Code Playgroud)

所以

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Run Code Online (Sandbox Code Playgroud)

注3

一般来说,建议使用===而不是==.建议的解决方案是此规则的一个例外.由于这个原因,JSHint语法检查器甚至提供了eqnull选项.

jQuery样式指南:

应使用严格的相等性检查(===)以支持==.唯一的例外是通过null检查undefined和null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;
Run Code Online (Sandbox Code Playgroud)

  • 对不起,但我不同意;-)使用`== null`是最有效的测试'null或undefined'(这是问题主题).它绝不是罕见的(在jQuery 1.9.1中使用了43次),因为你经常知道变量是声明的 - 或者你测试现有对象的属性,比如`if(o.foo == null)` . (32认同)
  • 谢谢你这个简洁的选择.在99%的代码中,没有必要区分null和undefined,因此这种检查的简洁性会导致代码混乱. (7认同)
  • @mar10 (aUndefinedVar == null) 给你一个“aUndefinedVar is not defined”错误不正确。 (3认同)
  • 非常重要的区别(顺便说一句,问题中已经提到了)。这就是为什么每个人都使用 typeof 。抱歉,但我不明白你的答案有什么用处,你只是陈述了问题中所说的内容,在前几行中你甚至说错了。 (2认同)
  • @Rannnn:这在“注释1”中讨论过 (2认同)

use*_*291 327

您必须区分两种情况:

  1. 未定义的变量,如undefined.如果在除了以外的任何上下文中访问未定义的变量,您将收到错误typeof.

    if(typeof someUndeclaredVar == whatever) // works
    if(someUndeclaredVar) // throws error
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 未定义的属性,如someExistingObj.someUndefProperty.未定义的属性不会产生错误并且只返回undefined,当转换为布尔值时,求值为false.所以,如果你不关心 0false使用if(obj.undefProp)就可以了.基于这个事实有一个共同的习语:

    let foo;
    if (foo) //evaluates to false because foo === undefined
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着"如果obj有属性prop,则分配给它value,否则分配默认值defautValue".

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

    value = obj.prop || defaultValue
    
    Run Code Online (Sandbox Code Playgroud)

  • 你没有解决0和false的问题 (44认同)
  • 你的意思是*未声明的*变量.可以声明变量,但仍然具有"undefined"值. (12认同)
  • 然后你可以谈论 hasOwnProperty 和原型。[] 中的 'indexOf' !== [].hasOwnProperty('indexOf') (2认同)
  • 使用`if(!! some_variable){...}`???有什么问题吗? (2认同)

Sem*_*mra 62

对于undefined,使用正常相等性检查null也将返回true.

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

JS Equality

  • NaN不等于Nan? (4认同)
  • @monotheist NaN不等于NaN(参见[MDN的NaN页面](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN)).Javascript使用IEEE-754作为浮点指定此行为.有一些想法,请参阅http://stackoverflow.com/a/23666623/2563765 (2认同)

Nar*_*ula 29

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

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false
Run Code Online (Sandbox Code Playgroud)

all返回false,类似于Python对空变量的检查.因此,如果您想围绕变量编写条件逻辑,那就说

if (Boolean(myvar)){
   // Do something
}
Run Code Online (Sandbox Code Playgroud)

这里"null"或"空字符串"或"未定义"将被有效处理.

  • OP只是想测试`null`和`undefined`的不同,其他的falsy值应该返回true! (9认同)
  • 虽然字面上使用关键字 _undefined_,`Boolean(undefined)` 可以工作,尝试使用未定义的 _variable_ **不** 工作,这就是检查 null 或 undefined 的全部意义所在。这:`if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }` 抛出一个 ReferenceError 说“ReferenceError: undeclareVarName is not defined” (3认同)
  • 支持下来喜欢ie5,为什么这不是更为人所知!? (2认同)
  • 它在条件中不增加任何价值。条件的计算结果完全相同,但对于 `0`、`NaN` 仍然返回 false。这是用于当您想要在不保留对对象的引用的情况下捕获对象的真实性时,以便您可以存储该对象而不是一些潜在的大对象。仅供参考,这也等价于 `!!value`,第一个 `!` 否定真实性,第二个再次否定它。 (2认同)

And*_*y E 21

如果您尝试引用未声明的变量,则会在所有JavaScript实现中引发错误.

对象的属性不受相同条件的约束.如果尚未定义对象属性,则在尝试访问它时不会引发错误.所以在这种情况下你可以缩短:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)
Run Code Online (Sandbox Code Playgroud)

if (myObj.some_property != null)
Run Code Online (Sandbox Code Playgroud)

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

if (window.some_variable != null) {
    // Do something with some_variable
}
Run Code Online (Sandbox Code Playgroud)

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

  • 你会错过NaN,0,""和错误,因为它们不是null也不是未定义但也是假的. (11认同)

Dre*_*kes 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
Run Code Online (Sandbox Code Playgroud)

让我们看看这里的哪些想法实际上通过了我们的测试.

这些工作:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null
Run Code Online (Sandbox Code Playgroud)

这些不起作用:

typeof(val) === 'undefined'
!!val
Run Code Online (Sandbox Code Playgroud)

我创建了一个jsperf条目来比较这些方法的正确性和性能.由于在不同的浏览器/平台上没有足够的运行,因此结果目前尚无定论.请花点时间在您的计算机上运行测试!

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


Jas*_*son 9

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

[undefined, null].includes(value)
Run Code Online (Sandbox Code Playgroud)

  • 它应该是您要检查的值。 (2认同)

TMS*_*TMS 7

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

通常,表达式为:

if (typeof(variable) != "undefined" && variable != null)
Run Code Online (Sandbox Code Playgroud)

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

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

if (window.variable != null)
Run Code Online (Sandbox Code Playgroud)

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

if (variable != null)
Run Code Online (Sandbox Code Playgroud)

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

if (obj.property != null)
Run Code Online (Sandbox Code Playgroud)


Yuk*_*élé 7

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

if (val == null) console.log('val is null or undefined')
Run Code Online (Sandbox Code Playgroud)

  • 这个答案大约在2019年还没有得到支持,但这是针对该用例的KISS之一。相反,也有`val!= null`,只有一个`=`,并且由于每个@Yukulele都是使用`==`的唯一一个,因此您会在看到它时知道它在做什么。 (3认同)
  • 这个答案就像那些专业提示之一! (3认同)
  • 哈,这就是为什么我的 IDE 只抱怨 `==` 的某些用法……哇,我讨厌 javascript! (2认同)

DDa*_*ave 5

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}
Run Code Online (Sandbox Code Playgroud)


Sab*_*abo 5

这是一个非常罕见的例子,建议使用==代替===。表达式somevar == null将返回 trueundefinednull,但对于其他所有内容都返回false(如果变量未声明,则为错误)。

!=正如预期的那样,使用将翻转结果。

现代编辑器不会警告使用==!=运算符null,因为这几乎总是期望的行为。

最常见的比较:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false
Run Code Online (Sandbox Code Playgroud)

自己试试:

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 },
]);
Run Code Online (Sandbox Code Playgroud)


Elm*_*mer 5

这也是一种很好的(但很冗长)的方法:

if((someObject.someMember ?? null) === null) {
  // bladiebla
}
Run Code Online (Sandbox Code Playgroud)

正在发生的事情非常清楚并且很难误解。这非常重要!:-)

这使用了??运算符(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)。someObject.someMember如果的值为nullor undefined,则??运算符将介入并生成该值null

说实话,我喜欢这个东西的明确性,但我通常更喜欢它someObject.someMember == null,它更具可读性,熟练的 JS 开发人员可能知道这里发生了什么。

  • 这对我来说根本不清楚。我不明白这个语法。您能解释一下吗? (3认同)