【问题标题】:Difference between if (x) { foo(); } and x ? foo() : 0;if (x) { foo(); 之间的区别} 和 x ?富():0;
【发布时间】:2011-05-19 10:42:28
【问题描述】:

片段 1:

if ( x ) { 
    foo();
}

片段 2:

x ? foo() : 0;  

这两个sn-ps有什么区别?

编辑:更正了语法错误。

更新:顺便说一句,似乎还有一个更短的符号:

x && foo();

【问题讨论】:

    标签: javascript


    【解决方案1】:

    片段 #2 是无效的 ECMAScript 表达式,因为它缺少必需的 : blah 以使其成为三元组。

    编辑:这两个 sn-ps 之间并没有真正的区别,如果 x 是真的,它们都会调用 foo。如果x 是假的(未定义/假/空字符串/0/),那么第一个 sn-p 将不会计算任何东西,后一个 sn-p 将计算为 00 确实对脚本。

    【讨论】:

    • 此外,块语法不会计算为任何值(它不是表达式)。三元运算符确实会计算出一个值。
    • @cdhowie 是的,但是三元表达式没有分配给我的代码中的任何内容,所以在这种情况下这没有区别。
    • 如果我们有 x ? foo() : bar() 并且函数没有返回任何内容。它是否是 ECMA 有效的,因为它实际上是值 undefined
    • @Martin:是的。表达式可以用作语句。并且任何函数都可以返回undefined 而不会出错。当您尝试使用undefined时,您就会崩溃。
    • @meder 好的,我想通了。谢谢。 (我认为这两者之间可能存在细微差别,但我想没有。)
    【解决方案2】:

    通常,if 是一个语句(例如,您不能将其分配给变量),而三元运算符 ?: 是表达式的一部分(产生一个可以分配给变量的值)。

    另外,if 块可以包含语句,而?: 的组件只能包含表达式。

    在您给出的示例中,没有区别,因为您不使用?: 的结果。 仅当 x 为真值时,两个 sn-ps 才会评估 foo()

    【讨论】:

      【解决方案3】:

      我想你是想问以下问题

      // Why should I use
      if (x) {
        do();
      }
      
      // instead of 
      x && do();
      

      // Why should I use
      if (x) {
        do(); 
      } else {
        dont();
      }
      
      //instead of 
      x ? do() : dont()
      

      在编写时,输出没有区别。我不喜欢在这些情况下使用三元或 && 运算符,因为使用三元和 && 的语义。三元组返回一个您没有使用的值,&& 表达式也是如此。因此,我宁愿使用语言打算使用运算符的方式。

      不过,我喜欢使用 && 进行空值检查

      var val = obj && obj.getValue();
      

      请注意,在这种情况下,我们使用的是表达式的返回值

      【讨论】:

      • +1 我喜欢这种技术:x && foo(); 而不是 if (x) { foo(); }。我会记住的。 :)
      • 当然……尽管那是我的反建议。我曾经使用它,但被其他开发人员说服不要这样做。
      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2019-12-30
      • 2013-06-14
      • 2011-06-10
      相关资源
      最近更新 更多