【问题标题】:How can I determine if a variable is 'undefined' or 'null'?如何确定变量是“未定义”还是“空”?
【发布时间】:2011-02-08 12:35:30
【问题描述】:

如何确定变量是undefined 还是null

我的代码如下:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

但如果我这样做,JavaScript 解释器会停止执行。

【问题讨论】:

标签: javascript jquery variables null undefined


【解决方案1】:

您可以使用abstract equality operator 的特性来执行此操作:

if (variable == null){
    // your code here.
}

因为null == undefined 为真,所以上面的代码将同时捕获nullundefined

【讨论】:

  • 我正在尝试测试 event 在 firefox 中是否为 null 并且错误阻止了执行:“event is undefined”
  • @MichaelFever 这怎么行?将其复制粘贴到您的控制台中:const y = undefined; y == null; 它应该返回 true
  • @ChrisStryczynski 在您的评论示例中,您声明了y 常量,但您注意比较abc(不是y)。当我在 Chrome 和 Firefox 上通过console.log(y == null); 测试y 时,我得到了true 结果。如果您遇到错误,那么您可能尝试使用赋值运算符 = 而不是比较 ==,这将返回错误,因为无法重新分配 const
  • 可能很棘手:undefined !== null --> true undefined == null --> true
  • live example 的相关比较。 lgtm.
【解决方案2】:

jQuery attr() 函数返回一个空白字符串或实际值(从不返回nullundefined)。它返回undefined 的唯一时间是您的选择器没有返回任何元素。

因此,您可能希望针对空白字符串进行测试。或者,由于空字符串、null 和 undefined 是 false-y,您可以这样做:

if (!EmpName) { //do something }

【讨论】:

  • Chrome 17.0.963.78 m 出现此错误:ReferenceError: EmpName is not defined
  • @EranMedan 我知道这已经很晚了,但希望它会帮助以后来这里的人。您收到错误的原因是因为它根本没有被声明。通常你会将 EmpName(或其他一些变量)传递给一个函数,或者另一个函数的返回值并因此声明(例如:“var x;”)。要测试它是否返回 undefined、null 或空白字符串,您可以使用上述解决方案。
  • 我意识到这是一个冷酷的问题,但是如果元素上不存在该属性,jQuery 将返回 undefined(不仅仅是如果选择器没有匹配的元素,根据答案) .例如,一个没有srcimg 将返回undefined$('img').attr('src');
【解决方案3】:
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

【讨论】:

  • 以防万一有人认为这是另一个半答案,这确实有效。 undefined 等于 null
  • 在 chrome 控制台中对我失败... ReferenceError: 变量未定义,因此它可能有效,但不适用于我...
  • 它只适用于已声明的变量,不适用于可能声明或未声明的变量,这种情况很少见。 (对于这种情况,您需要使用 typeof + null 检查)
  • 只需figured out,您可以在您的JS 文档或函数的顶部添加此评论:/*jshint eqnull:true */,JSHint 将停止警告您使用== null
  • @Aerovistae 您能否指出一个明确指出== 已损坏的参考资料。这个答案中的强制if(variable == null) 对我来说完全有意义......
【解决方案4】:

结合以上答案,似乎最完整的答案是:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

这应该适用于任何未声明或已声明并显式设置为 null 或未定义的变量。对于具有实际非空值的任何已声明变量,布尔表达式的计算结果应为 false。

【讨论】:

  • @Aerovistae 我知道typeof 是一个运算符,而不是一个函数,所以它不需要括号,但我还是很欣赏括号 - 只是为了阅读清晰。
  • 直接检查 if(variable===undefined) 而不是使用 typeof 怎么样?
  • @ArjunU 如果未声明变量将导致 ReferenceError。如果您不知道是否声明了变量,请使用上述解决方案。如果可以保证至少声明了变量,可以使用variable == null
  • 这是一个更好的解决方案,因为正如@Rogue 指出的那样,变量可能没有被声明。
  • 如果我错了,请纠正我,但第一个条件不是第二个的超集,因此第二个条件是多余的吗?
【解决方案5】:

我刚刚遇到了这个问题,即检查对象是否为空。
我只是用这个:

if (object) {
    // Your code
}

例如:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

【讨论】:

  • 最好设置 var A = document.getElementById("enterJob") if(A)A.className+= 'current';这样你就可以完成 50% 的工作以获得相同的结果......但也许你只是为了表演而这样做,然后我向你致敬。
【解决方案6】:

同时捕获nullundefined 的标准方法是:

if (variable == null) {
     // do something 
}

--100% 等同于更明确但不太简洁:

if (variable === undefined || variable === null) {
     // do something 
}

在写专业JS的时候,理所当然的会理解type equality and the behavior of == vs ===。因此我们使用==,并且只与null比较。


再次编辑

建议使用typeof 的cmets 完全是错误的。 是的,如果变量不存在,我上面的解决方案将导致ReferenceError。 这是一件好事。 这个 ReferenceError 是可取的:它可以帮助您在发布代码之前发现错误并修复它们,就像其他语言中的编译器错误一样。如果您正在处理您无法控制的输入,请使用 try/catch

您的代码中不应有任何对未声明变量的引用。

【讨论】:

  • 如果变量没有在代码中定义或引用,这将导致ReferenceError并中断执行,使用typeof更安全。
  • 这更像是一个风格点。如果变量没有在all处声明,那真的只是作者写得不好。您应该知道您的变量是否已被声明,这不应该是一个问题。但是,如果由于某种原因是这种情况,则应该将其更改为window.variable,而不仅仅是variable,不会导致引用错误。应避免使用 typeof。
  • 是的,因为您写的是 !== 而不是 !=
  • -OP:关于这些比较是“100% 等效”的声明是完全错误的,正如您在自己的编辑中指出的那样,第二个将导致 ReferenceError。至于断言:“您不应该在代码中引用任何未声明的变量。”真的吗?听说过可选参数吗? jsfiddle.net/3xnbxfsu
  • @TimothyKanski 可选参数如果未提供可选参数,则可能未定义,但它们绝对是声明的变量。它们被声明并具有undefined 的值,就像任何已声明但未初始化的变量一样,即var someVar;,因此您的论点并没有真正成立
【解决方案7】:

如果要检查的变量是全局变量,请执行

if (window.yourVarName) {
    // Your code here
}

即使yourVarName 变量不存在,这种检查方式也不会抛出错误。

示例:我想知道我的浏览器是否支持 History API

if (window.history) {
    history.back();
}

这是如何工作的:

window 是一个将所有全局变量作为其属性的对象,在 JavaScript 中尝试访问不存在的对象属性是合法的。如果history 不存在,则window.history 返回undefinedundefined 是假的,所以 if(undefined){} 块中的代码不会运行。

【讨论】:

  • 读者应该注意,像这样的方法用于检查 - 从浏览器中运行的 JavaScript - 是否已声明 global 变量,尤其是浏览器是否提供全局(如历史 API)可用。它将不起作用来检查非全局变量是null 还是undefined,如果您的JavaScript 在浏览器之外运行(即在Node.js 中),它也不起作用。它还会将设置为0false'' 的全局变量与未声明或undefinednull 的全局变量相同,这通常没问题。
  • 这假定脚本在浏览器中运行。这不是给定的。
【解决方案8】:

调用 typeof null 返回一个值“object”,因为特殊值 null 被认为是一个空对象引用。 Safari 5 版和 Chrome 7 版有一个怪癖,在正则表达式上调用 typeof 会返回“function”,而所有其他浏览器都返回“object”。

【讨论】:

    【解决方案9】:

    由于您使用的是 jQuery,因此您可以使用单个函数来确定变量是否未定义或其值为 null。

    var s; // undefined
    jQuery.isEmptyObject(s); // will return true;
    
    s = null; // defined as null
    jQuery.isEmptyObject(s); // will return true;
    
    // usage
    if(jQuery.isEmptyObject(s)){
        alert('Either variable: s is undefined or its value is null');
    }else{
         alert('variable: s has value ' + s);
    }
    
    s = 'something'; // defined with some value
    jQuery.isEmptyObject(s); // will return false;
    

    【讨论】:

    • 这对我不起作用。我仍然收到错误:ReferenceError: s is not defined 第一个示例。
    【解决方案10】:

    jQuery 检查元素不为空:

    var dvElement = $('#dvElement');
    
    if (dvElement.length  > 0) {
        // Do something
    }
    else{
        // Else do something else
    }
    

    【讨论】:

      【解决方案11】:
      if (typeof EmpName != 'undefined' && EmpName) {
      

      如果值不是,则评估为真:

      • null

      • 未定义

      • NaN

      • 空字符串 ("")

      • 0

      【讨论】:

      • 我认为这是一种危险的技术,已经像野火一样蔓延开来。因为许多检查的变量可能是布尔值或数字。所以如果用户没有完全理解后果,那就不好了。
      • 请提供此 javascript 电子规范的参考
      • 这与if (EmpName) 相同。如果是undefined 已经是假的了。
      • 如果变量没有定义。那么 if(EmpName) 会抛出错误
      • @Thamaraiselvam 我认为鲁迪可能是这个意思var EmpName; if (EmpName)。变量已定义但未赋值。
      【解决方案12】:
      var x;
      if (x === undefined) {
          alert ("only declared, but not defined.")
      };
      if (typeof y === "undefined") {
          alert ("not even declared.")
      };
      

      你只能使用第二个:因为它会检查定义和声明

      【讨论】:

        【解决方案13】:

        已编辑答案:在我看来,您不应该使用我下面的旧答案中的功能。相反,您可能应该知道变量的类型并直接使用根据检查(例如,想知道数组是否为空?只需执行if(arr.length===0){} 等)。这个答案甚至没有回答 OP 的问题。


        我是来为此编写自己的函数的。 JavaScript 很奇怪。

        它几乎可以用在任何东西上。 (请注意,这还会检查变量是否包含任何可用的。但由于通常还需要此信息,我认为值得发布)。请考虑留言。

        function empty(v) {
            let type = typeof v;
            if (type === 'undefined') {
                return true;
            }
            if (type === 'boolean') {
                return !v;
            }
            if (v === null) {
                return true;
            }
            if (v === undefined) {
                return true;
            }
            if (v instanceof Array) {
                if (v.length < 1) {
                    return true;
                }
            } else if (type === 'string') {
                if (v.length < 1) {
                    return true;
                }
                if (v === '0') {
                    return true;
                }
            } else if (type === 'object') {
                if (Object.keys(v).length < 1) {
                    return true;
                }
            } else if (type === 'number') {
                if (v === 0) {
                    return true;
                }
            }
            return false;
        }
        

        TypeScript 兼容。


        这个函数应该完全做和 PHP 的 empty() function 一样的事情(见 RETURN VALUES

        undefinednullfalse00.0"0"{}[] 视为空。

        "0.0"NaN" "true 被视为非空。

        【讨论】:

        • 我遇到了一个小空检查问题。我想检查传递的参数是空的还是空对象{ }。这是一个常见且愚蠢的语言问题,但我忘记了。我的所有搜索都显示了未定义空值或松散相等比较 ( == ) 的答案,但不显示严格相等 ( === ) 或等效的答案。然后在页面最底部的 -1 排名答案中(在我投票之前)是我无法回答的答案。 Object.keys( obj ).length &lt; 1 或者可能 === 0,假设它永远不会是 -1。无论如何,投票给0,哇。 :p
        • 谢谢,我已经能够删除这个函数并清理了很多代码。为什么这不是标准的 JS 函数,我无法理解。
        • 你应该在这里把你的==all改为===,那么这将是一个合理的功能。
        【解决方案14】:

        为了测试一个变量是空还是未定义,我使用下面的代码。

            if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
              console.log('variable is undefined or null');
            }
        

        【讨论】:

        • 关闭但没有。丢失typeof 并直接与undefined 进行比较,而不是作为字符串。这可行,但额外的运算符没有任何作用,只是让它变得更冗长。
        • 在这种情况下,是的,你是对的,我们不需要使用 typeof。但是在处理未定义的变量时,使用 typeof 是一个很好的做法。使用 typeof 的一个原因是,如果尚未声明变量,它不会抛出错误。
        • 这实际上是一件坏事。您不希望代码中有未声明的变量。您希望它抛出一个 ReferenceError 以便您可以找到变量并声明它。当然,您不会在 C++ 之类的编译语言中尝试这样做!仅仅因为JS允许它并不意味着它应该这样做。
        • 你的 or 语句是倒退的。检查某些东西是否未定义将是第一步,而不是第二步。
        【解决方案15】:

        我在 Chrome 控制台中运行此测试。使用 (void 0) 你可以检查 undefined:

        var c;
        undefined
        if (c === void 0) alert();
        // output =  undefined
        var c = 1;
        // output =  undefined
        if (c === void 0) alert();
        // output =   undefined
        // check c value  c
        // output =  1
        if (c === void 0) alert();
        // output =  undefined
        c = undefined;
        // output =  undefined
        if (c === void 0) alert();
        // output =   undefined
        

        【讨论】:

          【解决方案16】:

          最好的方法:

          if(typeof variable==='undefined' || variable===null) {
          
          /* do your stuff */
          }
          

          【讨论】:

          • @jkindwall 在 2013 年 10 月 11 日已经提供了这个确切的解决方案。stackoverflow.com/a/19323555/2943403 这个纯代码帖子完全没有用,因为它没有为页面添加新的价值。事实上,它正在增加页面膨胀并浪费研究人员阅读它的时间。请删除此答案。
          【解决方案17】:
          var i;
          
          if (i === null || typeof i === 'undefined') {
              console.log(i, 'i is undefined or null')
          }
          else {
              console.log(i, 'i has some value')
          }
          

          【讨论】:

          • 如果用户输入“未定义”这个词会发生什么?
          • 您的问题很好,它表明条件为真,因此我们需要将选项 normal undefined 更改为 typeof 条件。 @查克
          • 这是错误的。 typeof 永远不会产生 undefined,只会产生字符串 'undefined'。此外,如果iundefined,则i == null 已经为真,因此即使它有效,第二个布尔值也是多余的。
          • 此解决方案(条件相反)已由 @jkindwall 于 2013 年 10 月 11 日提供。stackoverflow.com/a/19323555/2943403 此纯代码帖子完全没用,因为它没有添加任何新内容页面的价值。事实上,它正在增加页面膨胀并浪费研究人员阅读它的时间。请删除此答案。
          【解决方案18】:

          我仍然认为测试这两个条件的最佳/安全方法是将值转换为字符串:

          var EmpName = $("div#esd-names div#name").attr('class');
          
          // Undefined check
          if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
              // Do something with your code
          }
          
          // Nullcheck
          if (Object.prototype.toString.call(EmpName) === '[object Null]'){
              // Do something with your code
          }
          

          【讨论】:

          • 您能解释一下为什么您认为这是执行测试的“最佳/安全方式”吗?
          • 因为转换总是返回一个“标准化”字符串(即[object Undefined]),所以你不会因为测试虚假值而陷入麻烦。这只是我根据真实/虚假价值观的经验得出的看法。
          • 感谢您的解释。我不是在批评,这是一个有趣的答案,我只是想让你为其他人提供一些解释,说明为什么这可能优于其他方法。
          • 别担心!我对这种类型的比较有很多问题,直到现在,我发现它是解决这个问题的最有用的方法。
          【解决方案19】:

          您可以通过简单地使用 typeof 来检查该值是否为 undefined 或 null:

          if(typeof value == 'undefined'){
          

          【讨论】:

          • 有关 typeof 的信息,请参阅上一个答案 (stackoverflow.com/a/21273362/6305294) 中的 cmets。
          • 这是不正确的。没有捕捉到null。我不明白为什么要为多年前给出正确和完整答案的问题提供新的不正确答案。您是否觉得目前的答案有些不足?
          【解决方案20】:

          if(x==null) 在 JavaScript 中是个坏主意。用"==" 判断 - 它可能会导致意外的类型强制,并且无法被 CoffeeScript 读取, 切勿在条件判断中使用“==”或“!=”!

          if(x) 会更好,但要小心 0 和 ""。它将被视为false,而不是与"!= null" 相等的方法是true

          JavaScript Best Practices

          【讨论】:

          • 这是完全不正确的,对任何专业级框架或软件的粗略研究将很快证实这一点。使用==null 进行比较是 在JS 中捕获nullundefined 的标准方法。在这种特定情况下,使用== 进行类型强制不是风险,实际上正在利用它来实现同时捕获nullundefined 的目标。请花更多时间使用该语言,然后再选择对多年前已圆满解决的问题提供错误和误导性的答案。
          • 避免使用“==”。一切都在不断变化,我不同意你@Aerovistae
          • 你不同意 me -- 你不同意整个 JavaScript 机构。让我们说清楚。
          【解决方案21】:

          使用以下解决方案:

          const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
          const isDeepEqual = (a, b) => getType(a) === getType(b);
          
          console.log(isDeepEqual(1, 1)); // true
          console.log(isDeepEqual(null, null)); // true
          console.log(isDeepEqual([], [])); // true
          console.log(isDeepEqual(1, "1")); // false
          etc...
          

          我可以检查以下内容:

          • 未定义
          • NaN
          • 字符串(“”)
          • 0

          【讨论】:

          • 这没有回答问题,即“我如何捕获 null 和 undefined?”而不是“我如何捕捉 JavaScript 中的每一个虚假值?”
          • @Aerovistae,我以为我用 console.log(isDeepEqual(null, null));和 console.log(isDeepEqual(undefined, undefined)); ?
          【解决方案22】:
          (null == undefined)  // true
          
          (null === undefined) // false
          

          因为 === 同时检查类型和值。两者的类型不同,但值相同。

          【讨论】:

            【解决方案23】:

            最简单的检查方法是:

            if(!variable) {
              // If the variable is null or undefined then execution of code will enter here.
            }
            

            【讨论】:

            • 如果变量的值为false,这将执行代码,这可能是不可取的。
            • 问题很清楚“如何确定变量是'undefined'还是'null'?”而在 javascript 中,如果变量的值为 null 或 undefined,则其值为 false。
            • 对不起,这是不正确的。这是一个JSfiddle 来证明它。
            • 通过您的回答,undefinednull 其他一些内容,例如空字符串、+0、-0 NaNfalse! 运算符将操作数 - 这里的 variable- 强制转换为布尔值:ecma-international.org/ecma-262/#sec-toboolean
            • 但是检查问题:“如何确定变量是未定义还是空”,!如果变量为 null 或未定义,则与 if 一起使用的操作数将始终返回 true。
            【解决方案24】:

            您可以简单地使用以下方法(我知道有更短的方法可以做到这一点,但这可能更容易直观地观察,至少对于其他查看代码的人来说)。

            if (x === null || x === undefined) {
             // Add your response code here, etc.
            }
            

            来源:https://www.growthsnippets.com/how-can-i-determine-if-a-variable-is-undefined-or-null/

            【讨论】:

              【解决方案25】:

              最短最简单的:

              if(!EmpName ){
               // DO SOMETHING
              }
              

              如果 EmpName 是,这将评估为 true:

              • 未定义
              • NaN
              • 字符串(“”)
              • 0

              【讨论】:

              • 这里的用例是我想知道undefined和false的区别。那么我将使用对 null 的检查。
              【解决方案26】:

              JavaScript 中,据我所知,我们可以检查 undefinednullempty 变量,例如下面。

              if (variable === undefined){
              }
              
              if (variable === null){
              }
              
              if (variable === ''){
              }
              

              检查所有条件:

              if(variable === undefined || variable === null || variable === ''){
              }
              

              【讨论】:

              • var 是保留字,这会抛出SyntaxError
              • @dhilt 从 var 到 variable 实现
              【解决方案27】:

              可能最短的方法是:

              if(EmpName == null) { /* DO SOMETHING */ };
              

              这是证据:

              function check(EmpName) {
                if(EmpName == null) { return true; };
                return false;
              }
              
              var log = (t,a) => console.log(`${t} -> ${check(a)}`);
              
              log('null', null);
              log('undefined', undefined);
              log('NaN', NaN);
              log('""', "");
              log('{}', {});
              log('[]', []);
              log('[1]', [1]);
              log('[0]', [0]);
              log('[[]]', [[]]);
              log('true', true);
              log('false', false);
              log('"true"', "true");
              log('"false"', "false");
              log('Infinity', Infinity);
              log('-Infinity', -Infinity);
              log('1', 1);
              log('0', 0);
              log('-1', -1);
              log('"1"', "1");
              log('"0"', "0");
              log('"-1"', "-1");
              
              // "void 0" case
              console.log('---\n"true" is:', true);
              console.log('"void 0" is:', void 0);
              log(void 0,void 0); // "void 0" is "undefined" 

              这里有更多关于==的详细信息(来源here

              奖励===== 更清楚的原因(查看agc answer

              【讨论】:

              • 谢谢你,很好的回答!像 if(var) 或 if(!var) 这样的表达式呢?
              • @IceFire 示例差异:if(var)/if(!var) 将为值 true/false 执行代码。 var 的那些值的if(var == null) 永远不会执行代码...
              • 嗯,这很简单,但是上面的矩阵之一也可以用来检查 if 表达式为不同的值产生什么吗?
              • @IceFire 在我的回答中有指向此图片来源的链接-那里还有 if 语句“矩阵”
              【解决方案28】:

              让我们看看这个,

              1.  

                let apple; // Only declare the variable as apple
                alert(apple); // undefined
                

                在上面,变量只声明为apple。在这种情况下,如果我们调用方法alert,它将显示未定义。

              2.  

                   let apple = null; /* Declare the variable as apple and initialized but the value is null */
                   alert(apple); // null
                

              第二个显示为null,因为apple的变量为null。

              因此您可以检查一个值是否未定义或为空。

              if(apple !== undefined || apple !== null) {
                  // Can use variable without any error
              }
              

              【讨论】:

                【解决方案29】:

                foo == null 检查应该可以解决问题并以最短的方式解决“未定义或空”的情况。 (不考虑“未声明 foo”的情况。)但是习惯了 3 个等于(作为最佳实践)的人可能不会接受它。看看 eslint 和 tslint 中的 eqeqeqtriple-equals 规则...

                当我们分别检查变量是 undefinednull 时,应该在这种情况下应用显式方法,我对这个主题的贡献(目前有 27 个非否定答案!)是使用void 0 作为对 undefined 执行检查的既短又安全的方式。

                使用foo === undefined 是不安全的,因为 undefined 不是保留字并且可以被隐藏 (MDN)。使用typeof === 'undefined' 检查是安全的,但如果我们不关心 foo-is-undeclared 的情况,可以使用以下方法:

                if (foo === void 0 || foo === null) { ... }
                

                【讨论】:

                  【解决方案30】:

                  如果你创建一个函数来检查它:

                  export function isEmpty (v) {
                   if (typeof v === "undefined") {
                     return true;
                   }
                   if (v === null) {
                     return true;
                   }
                   if (typeof v === "object" && Object.keys(v).length === 0) {
                     return true;
                   }
                  
                   if (Array.isArray(v) && v.length === 0) {
                     return true;
                   }
                  
                   if (typeof v === "string" && v.trim().length === 0) {
                     return true;
                   }
                  
                  return false;
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2014-03-15
                    • 2014-12-11
                    • 2016-05-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-05-06
                    • 2015-09-28
                    相关资源
                    最近更新 更多