【问题标题】:How to check a not-defined variable in JavaScript如何在 JavaScript 中检查未定义的变量
【发布时间】:2010-10-25 21:12:11
【问题描述】:

我想检查变量是否已定义。例如,下面抛出一个未定义的错误

alert( x );

我怎样才能发现这个错误?

【问题讨论】:

标签: javascript variables undefined


【解决方案1】:

抱歉,这里的大多数答案都混淆了“未定义”和“未定义”

  1. 未定义 - 声明了一个变量,但它的值未定义。

  2. 未定义 - 甚至没有声明变量。

检查这两种情况的唯一安全方法是使用typeof myVar === 'undefined'

myVar === undefined 只会检查案例编号 1。如果甚至没有声明 myVar,它仍然会抛出“myVar is not defined”。 OP专门询问“甚至没有定义”的情况。

附注我确实理解“案例 2”在现代 ES6 世界中变得越来越少,但一些旧的遗留组件仍然存在于过去。

【讨论】:

    【解决方案2】:

    在 JavaScript 中,null 是一个对象。对于不存在的事物还有另一个价值,undefined。对于几乎所有无法在文档中找到某些结构的情况,DOM 都会返回 null,但在 JavaScript 本身中,undefined 是使用的值。

    第二,不,没有直接的等价物。如果您真的想专门检查null,请执行以下操作:

    if (yourvar === null) // Does not execute if yourvar is `undefined`
    

    如果要检查变量是否存在,只能使用try/catch 完成,因为typeof 会将未声明的变量和以undefined 的值声明的变量视为等效。

    但是,要检查一个变量是否声明了并且不是undefined

    if (yourvar !== undefined) // Any scope
    

    以前,必须使用typeof 运算符来安全地检查未定义,因为可以像变量一样重新分配undefined。旧方式如下所示:

    if (typeof yourvar !== 'undefined') // Any scope
    

    undefined 可重新分配的问题已在 2009 年发布的 ECMAScript 5 中得到解决。您现在可以安全地使用 ===!== 来测试 undefined,而无需将 typeof 用作 @ 987654346@ 已经只读了一段时间了。

    如果你想知道一个成员是否独立存在但不关心它的值是什么:

    if ('membername' in object) // With inheritance
    if (object.hasOwnProperty('membername')) // Without inheritance
    

    如果你想知道一个变量是否为truthy

    if (yourvar)
    

    Source

    【讨论】:

    • undefined 不是保留字;您(或其他人的代码)可以执行“undefined = 3”,这将破坏您的两个测试。
    • “如果你知道变量存在但不知道其中是否存储了任何值”——嗯?!
    • 我认为他指的是一个尚未分配的已声明变量。例如:var foo; // foo 存在但没有值
    • 嗯...我刚刚注意到“来源”链接:整篇文章是从邮件列表中直接引用的,可能应该进行编辑以使其更清楚,因为原作者不是可以澄清。
    • “在 JavaScript 中,null 是一个对象。”,这实际上不是真的,而且这种误解的罪魁祸首可能是 typeof 运算符 (typeof null == 'object')。 null valueprimitive value,这是 Null type 的唯一值。
    【解决方案3】:

    只需执行以下操作:

    function isNotDefined(value) {
      return typeof value === "undefined";
    }
    

    然后这样称呼它:

    isNotDefined(undefined); //return true
    isNotDefined('Alireza'); //return false
    

    【讨论】:

      【解决方案4】:

      我使用一个小函数来验证变量是否已被声明,这确实减少了我的 javascript 文件中的杂乱程度。我添加了对该值的检查,以确保该变量不仅存在,而且还被分配了一个值。第二个条件检查变量是否也已实例化,因为如果变量已定义但未实例化(参见下面的示例),如果您尝试在代码中引用它的值,它仍然会抛出错误。

      未实例化 - var my_variable; 已实例化 - var my_variable = "";

      function varExists(el) { 
        if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
          return true; 
        } else { 
          return false; 
        } 
      }
      

      然后您可以使用条件语句来测试该变量是否已像这样定义和实例化...

      if ( varExists(variable_name) ) { // checks that it DOES exist } 
      

      或者测试它没有被定义和实例化使用...

      if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
      

      【讨论】:

      • 为什么不马上返回你的谓词呢? return typeof el !== "undefined" && typeof el.val() !== "undefined"
      【解决方案5】:

      void 运算符为传递给它的任何参数/表达式返回 undefined。因此您可以针对结果进行测试(实际上一些缩小器将您的代码从 undefined 更改为 void 0 以节省几个字符)

      例如:

      void 0
      // undefined
      
      if (variable === void 0) {
          // variable is undefined
      }
      

      【讨论】:

      • 叮叮!这是正确的答案。耻辱它一直在底部。每个人都在坚持使用 typeof 并认为 undefined 可以重新分配,这在大约十年内是不可能的。
      • 这在 ES5 之前也是安全的,因为那时即使你重新分配了 undefined ,因为只有上帝知道是什么原因,使用 void 0 总是会返回 undefined 无论如何。
      【解决方案6】:

      错误告诉你x 甚至不存在!它没有被声明,这与被分配一个值不同。

      var x; // declaration
      x = 2; // assignment
      

      如果您声明 x,您将不会收到错误消息。您会收到一条提示 undefined 的警报,因为 x 存在/已声明但尚未分配值。

      要检查变量是否已声明,您可以使用typeof,任何其他检查变量是否存在的方法都会引发与您最初遇到的相同的错误。

      if(typeof x  !==  "undefined") {
          alert(x);
      }
      

      这是检查存储在x 中的值的类型。它只会在x 尚未声明或已声明但尚未分配时返回undefined

      【讨论】:

      • undefined 自 ES5(2009 版)以来一直是只读的,您不再需要 typeof 运算符。
      • undefined !== 未定义,谢谢您的回答。如果你去 if(variable) 并且它没有定义你仍然会得到一个错误,而不是 typeof。
      【解决方案7】:

      另一个潜在的“解决方案”是使用window 对象。它避免了在浏览器中的引用错误问题。

      if (window.x) {
          alert('x exists and is truthy');
      } else {
          alert('x does not exist, or exists and is falsy');
      }
      

      【讨论】:

      • 这根本不能解决原来的问题,而且完全无关紧要。海报不是问如何测试某事是真还是假,他问的是如何测试undefined。这不会那样做。
      • 虽然我同意斯蒂芬的观点,但这实际上并没有回答这个问题,这正是我想要的。感谢@ubershmekel,添加“窗口”对象的想法帮助了我。 +1
      【解决方案8】:

      接受的答案是正确的。只是想再添加一个选项。您也可以使用try ... catch 块来处理这种情况。一个奇怪的例子:

      var a;
      try {
          a = b + 1;  // throws ReferenceError if b is not defined
      } 
      catch (e) {
          a = 1;      // apply some default behavior in case of error
      }
      finally {
          a = a || 0; // normalize the result in any case
      }
      

      注意catch 块,这有点混乱,因为它创建了块级范围。当然,为了回答所提出的问题,该示例被极其简化,它不包括错误处理的最佳实践;)。

      【讨论】:

        【解决方案9】:

        我经常用最简单的方法:

        var variable;
        if (variable === undefined){
            console.log('Variable is undefined');
        } else {
            console.log('Variable is defined');
        }
        

        编辑:

        不初始化变量,会抛出异常“Uncaught ReferenceError: variable is not defined...”

        【讨论】:

        • Uncaught ReferenceError: variable is not defined
        • @MuhammadUmer,错了! variablevar variable; 定义。这个 sn-p 将覆盖本地范围内的variable。它可以破坏期望访问闭包或全局变量的逻辑。即:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
        【解决方案10】:

        我们可以查看undefined如下

        var x; 
        
        if (x === undefined) {
            alert("x is undefined");
        } else {
             alert("x is defined");
        }
        

        【讨论】:

          【解决方案11】:

          您也可以使用三元条件运算符:

          var a = "hallo world";
          var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

          //var a = "hallo world";
          var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

          【讨论】:

          • 如果var a = false; 怎么办?你应该检查 a===undefined 是否改为
          • 问题:检查未定义的变量.....这是未定义的变量:var x; 执行上述操作会引发错误
          • "如果a = false,那么它会显示"我不知道'a'""——这就是问题所在,问题是测试它是否被定义,而不是它是否为真。如果 a 被定义为 false,则 a 不是未定义的。在这种情况下,这会返回错误的结果。请参阅我对stackoverflow.com/a/858270/2055492 的评论,了解有关此方法为何不起作用的更多详细信息。
          • 不仅!aundefined 测试为真,它还对0nullfalse 测试为真。这是非常不正确的,应该删除。
          【解决方案12】:

          真正测试变量是否为undefined 的唯一方法是执行以下操作。请记住,在 JavaScript 中 undefined 是一个对象。

          if (typeof someVar === 'undefined') {
            // Your variable is undefined
          }
          

          此线程中的一些其他解决方案会让您相信一个变量是未定义的,即使它已被定义(例如,值为 NULL 或 0)。

          【讨论】:

          • 因为这里的问题不是未定义的,所以应该是 typeof someVar !== 'undefined',对吧?
          • 真的,我不认为 undefinded 是一个对象,先检查文档developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
          • 唯一不会产生ReferenceError的测试。
          • 这段代码是正确的,但我认为说undefined是javascript中的一个对象是错误的信息。这个陈述是否与您的答案有关?它是一个undefined 类型的值undefined,分配给名为undefined 的全局标识符。
          • 现在这是不正确的,因为它是唯一的方法。 undefined 自 ES5 以来一直是只读的。您可以使用if (x === undefined) {...} 或使用这样的简写方式安全地测试未定义:if (x === void 0)
          【解决方案13】:

          一个更简单、更简写的版本是:

          if (!x) {
             //Undefined
          }
          

          if (typeof x !== "undefined") {
              //Do something since x is defined.
          }
          

          【讨论】:

          • 如果 x 是从函数调用中设置的,则第一个代码段可能不正确。像 x = A();如果 A 没有返回任何内容,它将默认返回“未定义”。做一个 !x 是真的,这在逻辑上是正确的。但是,如果 A() 返回 0,则 !x 应该为 false,因为 x=0。然而在 JS 中,!0 也是如此。
          • 第二个代码可以缩短为:if(!typeof(XX)){ ... }else{ ... }
          • @AlejandroSilva 抱歉回复晚了。这不起作用,因为 typeof 返回一个字符串,因此它将为未定义的变量返回“未定义”,而该变量又将评估为 TRUE,因此导致已定义变量的误报。
          • 请去掉第一个sn-p,太糟糕了
          • 其他 cmets 指出第一个示例不好,但不清楚原因。因此,对于任何新的编码人员: !x 不测试 x 是否已定义,而是测试它是否真实。字符串、布尔值 true 和正数都是真实的(我可能会忘记一些事情),但其他可能有效的值,如 0、布尔值 false 和空字符串不是真实的。第一个示例可以适用于特定用例(例如,如果您可以将空视为未定义,则测试字符串),但由于很多地方不会,因此不应将其视为默认检查方式。
          【解决方案14】:

          从技术上讲,正确的解决方案是(我相信):

          typeof x === "undefined"
          

          你有时会变得懒惰并使用

          x == null
          

          但这允许未定义的变量 x 和包含 null 的变量 x 返回 true。

          【讨论】:

          • 如果你输入var x;,然后输入typeof x;,你会得到"undefined",就像你输入typeof lakjdflkdsjflsj;一样
          • 所以没有办法检查未定义但声明的变量?
          • 我不这么认为;我不知道你为什么想要。
          • ujndefined 不应该在顶点之间
          • 顶点是什么意思?
          【解决方案15】:

          我经常这样做:

          function doSomething(variable)
          {
              var undef;
          
              if(variable === undef)
              {
                   alert('Hey moron, define this bad boy.');
              }
          }
          

          【讨论】:

          • 考虑将“==”更改为“===”。如果您调用 doSomething(null) 您也会收到警报。除非那是你想要的。
          • 是的。您必须决定是否要相等或完全相等。这两种情况都有用。
          • 像这样简单检查-> if(typeof variableName !== 'undefined'){ alert(variableName);}
          • 这是没用的,因为无论如何你都无法将未定义的 var 传递给函数
          • 当然可以。尝试调用不带参数的函数。
          猜你喜欢
          • 1970-01-01
          • 2011-02-03
          • 2021-01-31
          • 2018-10-03
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 2019-05-11
          • 1970-01-01
          相关资源
          最近更新 更多