【问题标题】:How to check for an undefined or null variable in JavaScript?如何在 JavaScript 中检查未定义或空变量?
【发布时间】:2011-02-03 07:08:50
【问题描述】:

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

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

有没有更简洁的检查方法具有相同的效果?

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

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

不幸的是,当some_variable 未定义时,Firebug 将这样的语句评估为运行时错误,而第一个语句就可以了。这只是 Firebug 的一种(不需要的)行为,还是这两种方式之间真的有一些区别?

【问题讨论】:

标签: javascript null undefined


【解决方案1】:

我认为测试“价值是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

正如问题中提到的,短变体要求 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;

编辑 2021-03:

如今most browsers 支持Nullish coalescing operator (??)Logical nullish assignment (??=),它允许更简洁的方式 如果变量为 null 或未定义,则分配默认值,例如:

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

可以写成这些形式中的任何一种

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;

【讨论】:

  • 非常重要的区别(顺便说一句,问题中已经提到过)。这就是为什么每个人都使用 typeof。抱歉,我不知道你的答案在哪里有用,你只是陈述了问题中所说的内容,并且在前几行中你甚至说错了。
  • 对不起,但我不同意 ;-) 恕我直言,使用 == null 是测试“null 或 undefined”(这是问题主题)最有效的方法。这绝不是罕见的(在 jQuery 1.9.1 中使用了 43 次),因为您经常知道该变量已被声明 - 或者您测试现有对象的属性,例如 if( o.foo == null)
  • @mar10 (aUndefinedVar == null) 给你一个“aUndefinedVar 未定义”错误不是真的。
  • @Rannnn:这在“注 1”中进行了讨论
  • 感谢这个简洁的选项。在我 99% 的代码中,不需要区分 null 和 undefined,因此这种检查的简洁性可以减少代码的混乱。
【解决方案2】:

你必须区分不同的情况:

  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。所以,如果你不在乎 0false,使用 if(obj.undefProp) 是可以的。基于这个事实有一个常见的成语:

    value = obj.prop || defaultValue
    

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

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

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

【讨论】:

  • 然后你可以谈谈 hasOwnProperty 和原型。 'indexOf' in [] !== [].hasOwnProperty('indexOf')
  • 是的,我想过添加这个,但为了简洁而决定牺牲完整性。 ;)
  • 你没有解决0和假的问题
  • 你的意思是未声明的变量。可以声明一个变量,但其值仍为 undefined
  • 还要注意typeof返回一个字符串。所以var myVar; typeof(myVar)==undefined 返回false 而不是true
【解决方案3】:

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

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

【讨论】:

  • NaN 不等于 Nan?
  • @monotheist NaN 不等于 NaN(请参阅 MDN's NaN page)。 Javascript 使用 IEEE-754 作为指定此行为的浮点数。对此有一些想法,请参阅stackoverflow.com/a/23666623/2563765
  • @SharjeelAhmed 它已在数学上更正。差分方程中的NaN 永远不可能相等
【解决方案4】:

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

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

对于任何其他比较,应使用严格比较器(===!==)。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

【讨论】:

  • 这个大约在 2019 年的答案缺乏支持,但它是这个用例的 KISS 答案。还有val != null,相反,只有一个=,因为每个@Yukulele 它是唯一一个使用== 的人,当你看到它时你就会知道它的作用。
  • @DKebler 我根据您的评论更改了答案。
  • 这个答案就像那些专业提示之一!
  • 哈哈,这就是为什么我的 IDE 只抱怨 == 的某些用途……哇,我讨厌 javascript!
【解决方案5】:

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

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

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

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

这里“null”或“empty string”或“undefined”将得到有效处理。

【讨论】:

  • 支持到喜欢ie5,为什么这个不为人所知!?
  • OP 只是想测试 nullundefined 的不同,其他虚假值应该返回 true!
  • 它在条件中没有添加任何值。对于0NaN,条件的计算结果完全相同并且仍然返回false。这是为了当您想要捕获对象的真实性而不保留对该对象的引用时,您可以存储该对象而不是一些潜在的大对象。仅供参考,这也相当于!!value,第一个! 否定真实性,第二个再次否定它。
  • > 仅供参考,这也相当于 !!value,第一个!否定真实性。哪个FYI也相当于if (var),它将被转换为布尔值,所以基本上完​​全没用......
  • 虽然字面上使用关键字 undefinedBoolean(undefined) 有效,但尝试使用未定义的 变量 无效工作,这就是检查 null 或 undefined 的重点。这:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); } 抛出一个 ReferenceError 说“ReferenceError: undeclareVarName is not defined”
【解决方案6】:

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

【讨论】:

  • 你会错过 NaN, 0, "" 和 false 因为它们不是 null 也不是 undefined 而是 false。
  • @Andreas Köberle 是对的。即使是非严格相等运算符也表示 null 与 NaN、0、"" 和 false 不同。您必须执行 if (myObj.some_property != null) 才能获得等效的行为。
【解决方案7】:

首先,您必须非常清楚您测试的内容。 JavaScript 有各种各样的隐式转换来绊倒你,还有两种不同类型的相等比较器:=====

测试nullundefined 的函数test(val) 应具有以下特征:

 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

【讨论】:

    【解决方案8】:

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

    [undefined, null].includes(value)
    

    【讨论】:

    • 不行! ReferenceError: 值未定义
    • 应该是你要检查的值。
    • 只有在没有 typeof 的情况下才有效。除此之外,它又好又短。喜欢。
    • @qräbnö - 它相当于更短的value != null。我可以看到的一个好处是它不需要知道== null!= null 将值undefined 的声明变量视为等于null。恕我直言,这不足以使用这种不熟悉(而且效率低下 - 每次都创建一个数组)的语法。
    • 无论如何我都喜欢。您可以添加更多检查,例如空字符串。
    【解决方案9】:

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

    一般来说,表达式:

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

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

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

    if (window.variable != null)
    

    如果是local,可以避免这个变量未声明的情况,也可以简化为:

    if (variable != null)
    

    如果是对象属性,就不用担心ReferenceError:

    if (obj.property != null)
    

    【讨论】:

    • navigatorwindow 的一部分吗?当我们得到navigator is not defined 的异常时,我们可以使用window.navigator != null 测试吗?
    • 回复 If it is local, you can probably avoid situations when this variable is undeclared,。事实上,如果它是local,它不能是未声明的——所以这不是问题。你的代码 sn-p 总是好的。 [如果没有变量的 local 声明,那么它是 - 根据定义 - 对 global 变量的引用 - 如果您认为它是,这可能是一个编程错误本地,因此导致运行时错误是一件好事。加强使用更短的代码 sn-p 的价值。]
    【解决方案10】:

    这是一个非常罕见的例子,建议使用== 而不是===。对于undefinednull,表达式somevar == null 将返回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 },
    ]);
    

    【讨论】:

      【解决方案11】:

      你可以检查变量是否有值。意义,

      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
      }
      

      【讨论】:

        【解决方案12】:

        与你所拥有的类似,你可以做类似的事情

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

        【讨论】:

        • 非常明显且易于维护的代码。希望有一个特定的运算符(除了 '==') - 类似于 '??some_variable' (类似于 Nullish 合并运算符,将 'null' 和 'undefined' 分组为虚假,但将 0 视为真实) .
        【解决方案13】:

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

        没有

        【讨论】:

          【解决方案14】:

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

          【讨论】:

            【解决方案15】:

            如果 if 语句的目的是在将值分配给变量之前检查 nullundefined 值,则可以使用 Nullish Coalescing Operator。根据caniuse 的数据,大约 85% 的浏览器应该支持它(截至 2021 年 1 月)。运算符示例如下:

            const a = some_variable ?? '';
            

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

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

            【讨论】:

              【解决方案16】:

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

              !!window['bleh'];
              

              当 bleh 没有被声明和赋值时,这将返回 false。

              【讨论】:

              • 但是,对于任何falsey 值,它返回 false:该问题要求进行 等效于 typeof(some_variable) != 'undefined' && some_variable != null 的测试。这个答案不等于那个。
              【解决方案17】:

              为了便于理解,我们来分析一下 Javascript 引擎在 undefined 、 null 和 '' (也是空字符串)转换时返回的值是什么。您可以直接在开发者控制台上查看。

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

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

              我还想指出一件事。

              Boolean(0) 的结果是什么?

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

              【讨论】:

                【解决方案18】:

                我已经用这个方法做到了

                将 id 保存在某个变量中

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

                然后使用 if 条件

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

                【讨论】:

                  【解决方案19】:

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

                  if(someObject.someMember ?? null === null) {
                    // bladiebla
                  }
                  

                  发生的事情非常清楚,而且很难被误解。这可能非常重要! :-)

                  这使用 ?? 运算符 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)。如果someObject.someMember 的值为nullundefined,则?? 运算符将启动并将值null

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

                  【讨论】:

                  • 我一点都不清楚。我不明白这种语法。你能解释一下吗?
                  【解决方案20】:

                  测试空值 (if (value == null)) 或非空值 (if (value != null)) 比测试变量的定义状态要简单。

                  此外,如果使用布尔值 false 定义变量(或对象属性),则测试 if (value)(或 if( obj.property))以确保其存在会失败。警告购买者:)

                  【讨论】:

                    【解决方案21】:

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

                    工作示例:

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

                    【讨论】:

                      【解决方案22】:

                      在 ES5 或 ES6 中,如果需要多次检查,可以这样做:

                      const excluded = [null, undefined, ''];
                      
                      if (!exluded.includes(varToCheck) {
                        // it will bee not null, not undefined and not void string
                      }

                      【讨论】:

                        【解决方案23】:

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

                        【讨论】:

                          【解决方案24】:

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

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

                          【讨论】:

                            【解决方案25】:

                            你必须定义一个这种形式的函数:

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

                            【讨论】:

                            • 如果变量未声明,也会产生同样的ReferenceError。
                            猜你喜欢
                            • 1970-01-01
                            • 2012-08-29
                            • 2010-10-25
                            • 1970-01-01
                            • 2021-01-31
                            • 2021-10-05
                            相关资源
                            最近更新 更多