代码之家  ›  专栏  ›  技术社区  ›  JoeM05

一个单一的等于一个if。Javascript。有什么好的理由吗?

  •  7
  • JoeM05  · 技术社区  · 16 年前
    jQuery.each(player, function(key, val){                     
         if (el = $("#pr_attr_plain_"+key)){
              el.text(val === "" ? 0 : " " + val);
         }
    });
    

    我继承了一个项目,我遇到了一些奇怪的事情。启动这个项目的人是一个经验丰富的程序员,当然比我自己更是如此。这样做是否有任何价值或理由(无论多么糟糕):

    if (el = $("#pr_attr_plain_"+key))
    

    7 回复  |  直到 16 年前
        1
  •  11
  •   LatinSuD    16 年前

    它可能是正确的。 代码相当于:

    jQuery.each(player, function(key, val){                     
         el = $("#pr_attr_plain_"+key);
         if (el){
              el.text(val === "" ? 0 : " " + val);
         }
    });
    
        2
  •  3
  •   Aishwar    16 年前

    如果 el = $("#pr_attr_plain_"+key) 计算结果为 0 或 false null undefined ,它不会进入if块。在所有其他情况下都会。

        3
  •  3
  •   Tgr    16 年前

    这只是一种丑陋的写作方式

     el = $("#pr_attr_plain_"+key);
     if (el){
          el.text(val === "" ? 0 : " " + val);
     }
    

    也就是说

     if ($("#pr_attr_plain_"+key)){
          $("#pr_attr_plain_"+key).text(val === "" ? 0 : " " + val);
     }
    

    但是稍微快一点(少打一次电话给 $ 功能),而且可以说更容易阅读。另一方面,它也有几个问题:

    • $(something) $(something).length .
    • 不需要整体 if . 你可以直接写 $("#pr_attr_plain_"+key).text(val === "" ? 0 : " " + val); 如果jQuery选择器与任何元素都不匹配,则它将不起作用。
    • 除非 el 已经用过了,你应该写 var el =... 不 el = 否则 将是全球性的。
    • 因为这是一个常见的错误,不小心写 = 而不是 == ,建议避免在条件内赋值,或使用额外的圆括号明确说明您是故意这样做的:

    .

     if ((el = $("#pr_attr_plain_"+key))){
          el.text(val === "" ? 0 : " " + val);
     }
    
        4
  •  1
  •   AutoSponge    16 年前

    正如在JSLint上指出的那样,这是一种不好的做法,因为它也可能是一个常见的错误。最好把它修好,减少错误解释的机会。

        5
  •  0
  •   Josh K    16 年前

    呃,也许测试一下 $ 危险

        6
  •  0
  •   Just Jake    16 年前

    现在就开始了 el 到 $("#pr_attr_plain_"+key) $() 失败,返回 null , false 或 0 .

        7
  •  0
  •   Dan Aditi    16 年前

    工作分配 if 语句并不是那么常见,但在一些支持它的语言中,它确实会突然出现,并且经常用于使代码更加简洁。

    它通常被保留在这样的情况下,即您希望将一个值赋给一个临时变量,以测试它的“真值”,然后对它执行其他操作。例如:

    if (foo = performExpensiveOperation()){
        doSomethingElse(foo); // this only happens if 'foo' is true
    }
    

    ..比备选方案短了一点点:

    foo = performExpensiveOperation();
    if (foo) {
        doSomethingElse(foo);
    }
    

    var 中的关键字 声明(即, if (var foo = bar)

    我看到它在Perl中也有相当一部分使用,因为它还具有将变量限制为 的词法范围。这也是Javascript不能做到的(好吧,支持 let 正在到达那里)。