【问题标题】:Way to differentiate between declared variable vs undeclared [closed]区分已声明变量与未声明变量的方法[关闭]
【发布时间】:2013-08-01 08:55:21
【问题描述】:

我有问题。 如果满足我的条件,我只会声明一个变量。

if(//some condition1)
var some1=1;
else if(//some condition1)
var some2=2;

现在

var some3=some1+some2;

如果满足两个条件,在some3;中有sum就可以了

如果只满足一个条件,我希望在some3 中有some1some2

我怎样才能做到这一点?

注意:感谢您的回答但我只想在满足该条件时声明变量。 还有其他解决办法吗?

【问题讨论】:

  • 为什么不先声明变量,然后在满足条件时设置它们的值
  • @Loney 您检查 if(var == undefined) 条件,然后只添加已定义的条件
  • @captain 你是说if(typeof var === "undefined") 吗?
  • 不满足条件时声明变量有什么危害?
  • 请记住,由于 Javascript 提升变量声明的方式,即使不满足条件,if 语句中的声明也会被提升到函数中。

标签: javascript


【解决方案1】:
var some3=0;

if(//some condition1){
  var some1=1;
  some3 += some1;
}else if(some condition2){
  var some2=2;
  some3 += some2;
}

编辑:更好的选择:

var some3=0;           
if(some condition1){
   some3 += 1;
}else if(some condition2){
   some3 += 2;
}

而且这两个条件不会同时满足,所以,如果你愿意,你也可以像下面那样做

var some3=0;           
if(some condition1){
   some3 += 1;
}
if(some condition2){
   some3 += 2;
}

【讨论】:

  • @Deepenshu 问题说只有在条件为真时才应该声明变量
  • 很好的逻辑,但你正在重新声明你的变量。还可以稍微改进一下格式
  • @Deepanshu 请检查问题。它说仅在满足该条件时声明变量
  • 这里不需要声明 some1 和 some2。您可以直接将其添加到 some3。
  • 我认为 OP 的意思是 definedundefined 而不是 declaredundeclared。使用var some3; 我声明了变量,但它仍然未定义。声明变量(即使在 if 中)将在本地声明它的完整函数范围。
【解决方案2】:

首先,您不能仅在满足某个条件时才声明变量。 JavaScript 具有函数作用域,这意味着无论您在代码中的哪个位置编写var some1,它都将始终被提升到函数作用域的顶部:

function A() {
   if (...) {
       var a = 1;
   }
}

将被解释为:

function A() {
   var a;
   if (...) {
       a = 1;
   }
}

话虽如此。我认为要解决您的问题,您只需要使用 0 初始化变量:

var some1 = 0,
    some2 = 0,
    some3;

if(//some condition1)
    some1 = 1;
else if(//some condition1)
    some2 = 2;

some3 = some1 + some2;

编辑

实际上,有一种方法可以仅在满足条件时声明变量:

if (...) {
    eval("var x = 1;");
}

但我真的不认为有任何需要这样的“黑客”,并且根本不会建议这种方法。

【讨论】:

    【解决方案3】:

    先将两个变量初始化为0。

    var some1 = 0, some2 = 0;
    if (condition1) {
        some1 = 1;
    }
    if (condition2) {
        some2 = 2;
    }
    var some3 = some1 + some2;
    

    由于您希望同时满足两个条件并设置两个变量,因此不应使用else if。只有两个单独的 if 语句。

    【讨论】:

      【解决方案4】:
      if(//some condition1) {
          var some1 = 1;
      } else if(//some condition1) {
          var some2 = 2;
      }
      
      var some3 = 0;
      
      if(some1 !== undefined) {
          some3 += some1;
      }
      if(some2 !== undefined) {
          some3 += some2;
      }
      

      【讨论】:

      • 这对我来说似乎是正确的答案。只有一个建议,使用与null 的比较或使用typeof some1 === 'undefined',因为与undefined 比较并不完全安全
      • 为什么不完全安全?
      • 因为在旧环境中可以覆盖undefined 的值并将其更改为true,这会破坏很多东西。
      • 这将帮助人们摆脱过时的东西。
      【解决方案5】:

      一个对象怎么样:

      var obj = {};
      if(//conditon){
         obj.some1 = 1;
      }
      else if(//condition){
         obj.some2 = 1;
      }
      
      var sum3 = 0;
      for(var key in obj){
          sum3 += obj[key];
      }
      

      【讨论】:

        【解决方案6】:

        为什么不先声明变量,然后在满足条件时设置它们的值

        var some1 = 0;
        var some2 = 0;
        
        if (//some condition)
        {
          some1 = 1;
        }
        if (// some condition)
        {
          some2 = 2;
        }
        
        var some3 = some1 + some2;
        

        【讨论】:

          【解决方案7】:

          在开头声明所有变量。将它们初始化为0。如果满足条件,则更改变量值。然后,当你求和时,任何加 0 的值都保持不变。或者如果满足条件,则该值不会为 0。

          【讨论】:

            【解决方案8】:

            如果您需要使用该模型,您可以只使用第四个变量。

            var some0 = 0
            if(/*some condition1*/) {
            var some1=1;
            some0 = some1 + some3
            }
            else if(/*some condition1*/) {
            var some2=2;
            some0 = some2 + some3
            }
            some3=some0
            

            【讨论】:

              【解决方案9】:

              怎么样:

              var some3 =
              (2 > 4      ? 10:0) +
              (5 < 8      ? 20:0) +
              (10 == 11   ? 30:0) +
              ('a' < 'b'  ? 40:0) ;
              

              我承认这看起来不漂亮。

              【讨论】:

                【解决方案10】:
                var some3 = 0; //Assingning global var.
                if(//some condition1)
                  var some1=1;
                else if(//some condition1)
                  var some2=2;
                

                条件

                if(some1 != null && some2 != null )
                  some3=some1+some2;
                else if(some1 != null && some2 == null)
                  some3=some1;
                else if(some1 == null && some2 != null)
                  some3=some2;
                else if(some1 == null && some2 == null)
                  some3=some3;
                

                然后

                alert(some3);
                

                【讨论】:

                  【解决方案11】:

                  你会使用

                  if(//一些条件1) var some1=1;

                  else if(//some condition1) var some2=2;

                  然后尝试像我的 jsfiddle 中的 catch 语句

                  try{
                  
                   var some3=some1+some2;
                  
                  }
                  catch (e){
                      try{
                        var some3=some1;
                        document.getElementById("test").innerHTML= some3;
                  
                      }catch (e){
                          try{
                             var some3=some2 ;
                             document.getElementById("test").innerHTML= some3;
                  
                          }
                          catch (e){
                          document.getElementById("test").innerHTML="Something went wrong!!!!or no condition satisfied";
                          }
                      }
                  }
                  

                  【讨论】:

                  • (由于抛出异常的开销,异常的使用效率低下,但我只是在其他答案中提供了一个额外的选项。)有关 @ 中 try catch 副作用的更多信息987654322@。为了回答这个问题@jon-j 创建了这个fiddle 来证明这一点。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-01-15
                  • 2020-04-12
                  相关资源
                  最近更新 更多