【问题标题】:How can I check if a variable exist in JavaScript?如何检查 JavaScript 中是否存在变量?
【发布时间】:2011-08-18 06:28:55
【问题描述】:

我不是在问变量是未定义还是null。我想检查变量是否存在。这可能吗?

【问题讨论】:

  • 这只是我的看法,但对于任何基于检查变量或函数是否存在的逻辑来说,这似乎都是一种糟糕的方法。如果你的逻辑需要一些变量,我真的认为这是一个语义或语法错误,而不是一个逻辑决定。

标签: javascript


【解决方案1】:
if ('bob' in window) console.log(bob);

记住这种方式,即使你用var声明了一个变量,也意味着它存在。

【讨论】:

  • 这是不正确的。 window.bob = false 是一个反例。
  • 好吧,写了一个新的。
【解决方案2】:

当您尝试访问未在上下文中声明的变量时,您会看到错误消息说它未定义。这是您可以执行的真正检查,以查看变量是否已定义,而不是 null 检查。

【讨论】:

    【解决方案3】:

    typeof 技术不起作用,因为它们无法区分根本未声明变量和已声明变量但未分配值或声明并设置为 undefined。

    但是,如果您尝试使用尚未在 if 条件(或赋值右侧)中声明的变量,则会出现错误。所以这应该有效:

    var exists = true;
    try {
        if (someVar)
            exists = true;
    } catch(e) { exists = false; }
    if (exists)
       // do something - exists only == true if someVar has been declared somewhere.
    

    【讨论】:

    • +1 用于解释和解决方案。考虑一下这个修改:var exists = false; try { eval("someVar"); exists = true } catch (e) { }; if (exists) ... -- eval() 是为了防止一个超级智能的 Javascript 引擎优化它。它还会欺骗大多数其他静态分析。
    • 是的,即使忽略潜在的优化,我在发布后意识到在 try 块内有一个额外的 exists = true; 既多余又令人困惑,因为它并不是逻辑的一部分:if (someVar) {}鉴于 if() 的意义在于尝试崩溃而不是在可行的情况下不做某事,所以应该已经完成​​了这个技巧。分配可能是比 if 或如您所说的 eval 更好的选择。
    • 可以像var exists = true; try {someVar} catch(e) {exists = false;}一样简单。
    【解决方案4】:

    如果您不需要在运行时知道,请使用 JSLint。还要记住,javascript var 语句被提升,所以即使 var 在 if 块内,它仍然会被定义。

    老实说,我认为如果您不确定是否定义了变量,那么您做错了什么,应该重构您的代码。

    【讨论】:

      【解决方案5】:

      试试这个

      var ex=false;
      try {(ex=myvar)||(ex=true)}catch(e) {}
      alert(ex);
      

      如果myvar 已声明,则ex 为真。

      工作示例:http://jsfiddle.net/wcqLz/

      【讨论】:

        【解决方案6】:

        我认为这取决于你想对变量做什么。

        假设,例如,您有一个 JS 库,如果它已定义,它将调用一个函数,如果没有,则不。您可能已经知道,函数是 JS 中的第一级对象,也是变量。

        您可能会想先询问它是否存在,然后再调用它。但是您也可以将调用它的尝试包装在 try/catch 块中。

        在触发事件之前和之后调用函数(如果已定义)的代码示例:

        function fireEvent(event)
        {
            try
            {
                willFireEvent(event); // Is maybe NOT defined!
            } catch(e) {}
        
            //... perform handler lookup and event handling
        
            try
            {
                hasFiredEvent(event); // Might also NOT exist!
            } catch(e) {}
        }
        

        因此,与其检查变量,不如捕获错误:

        var x;
        
        try
        {
            x = mayBeUndefinedVar;
        }
        catch (e)
        {
            x = 0;
        }
        

        这在性能等方面是否是好事,取决于你在做什么......

        【讨论】:

          【解决方案7】:

          我使用这个功能:

          function exists(varname){
              try {
                  var x = eval(varname);
                  return true;
              } catch(e) { return false; }
          }
          

          希望这会有所帮助。

          【讨论】:

          • 如果变量不是全局变量怎么办? (或者你是否在任何需要它的函数中声明该函数?)
          • 评估一个变量只是为了检查它是否存在。没有永不。埃瓦尔是邪恶的!这里有很大的安全漏洞。
          【解决方案8】:

          你追求的是:

          window.hasOwnProperty("varname");
          

          更安全的方法甚至可能是:

          this.hasOwnProperty("varname");
          

          不过取决于您的调用上下文...

          【讨论】:

          • 如果变量不是全局变量怎么办?那么它将不是windowthis 的属性。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-25
          • 2014-01-20
          • 2014-01-30
          • 2012-07-05
          • 1970-01-01
          • 2014-01-10
          相关资源
          最近更新 更多