【问题标题】:Is <boolean expression> && statement() the same as if(<boolean expression>) statement()?<boolean expression> && statement() 和 if(<boolean expression>) statement() 一样吗?
【发布时间】:2012-09-21 18:26:21
【问题描述】:

这两个是一样的吗?

假设你有:

var x = true;

然后你有一个:

x && doSomething();

if(x) doSomething();

这两种语法有什么不同吗?我是不是偶然发现了一点糖?

【问题讨论】:

  • 在您的情况下,结果将是相同的。
  • 你缩小你的代码吗?如果是这样,请不要这样做。编写清晰易读的代码,并让 minifier 负责调整。
  • @user1689607 我个人认为前者更简洁/优雅/可读,假设它在语义上相同。

标签: javascript syntax if-statement boolean syntactic-sugar


【解决方案1】:

严格来说,它们会产生相同的结果,但如果将前一种情况用作其他情况的条件,则会得到不同的结果。这是因为在x &amp;&amp; doSomething() 的情况下,doSomething() 将返回一个值来表示其成功。

【讨论】:

  • 我可以将语法用于其他类型的语句吗?反正都是表情,不是吗?我的意思是,var x; &lt;boolean expr&gt; &amp;&amp; x = 'boolean expr was true';if(condition) 后面的任何语句都可以在 &amp;&amp; 后面产生相同的结果,即使它不涉及方法调用?
  • 任何计算结果为值的表达式都可以包含在布尔运算中。
  • 不是所有的语句都是js表达式吗?
【解决方案2】:

不,它们不相同。 if 是一个语句,而AND 运算符是一个表达式

这意味着你可以在其他表达式中使用它的结果,而你不能使用 if 语句:

var result = x && doSomething();

但是,在您的情况下,两者都具有相同的效果。使用更具可读性并更好地代表您的程序结构的一种;我建议使用 if 语句。

【讨论】:

【解决方案3】:

总之不,这两种说法是不相等的,虽然在你提出的具体情况下,结果是一样的。

x &amp;&amp; doSomething(); 是一个表达式,首先评估 x,因为这是一个 AND 并且由于 x 为真,然后评估第二个参数 (doSomething())。在这种情况下,这意味着该方法已被执行。如果x 为假,则不会执行 doSomething(),因为表达式的结果不能为真。

if(x) doSomething(); 是一个声明。检查 x 的值,如果为真,则执行 if 语句的范围。

我将这个fiddle 放在一起进行演示(稍作修改)。

【讨论】:

  • 所有表达式都作为独立语句有效吗?
【解决方案4】:

简短回答:否。

长答案:

@Steve x &amp;&amp; doSomething() 声明的一个表达式

if(x) doSomething(); 是一个声明

根据@Daniel Li 和@Bergi 的建议,想想:

  • 表达式被计算(应该返回一个值here)。

  • 一个 statement 被声明(not 应该返回一个值 here,想想 side-effects )。

为什么会让人困惑?

  • JS 允许我们写( thatExpression );
  • JS 允许我们写thatExpression;

两者都假设某种doNothingWithValueOf 声明。

如何选择?

你使用:

  • doSomething() 作为
    • 表达式,想想IsMyObjectWhatever()MyObjectComputedValue()
    • 或者作为一个声明,认为ModifyMyObject()

然后:您是否使用x &amp;&amp; doSomething() 作为表达式

你最终会到处想thisStatement( thatExpression );之类的东西,想想:

  • () 表达式,
  • ; 声明。

那我为什么要选择呢?

【讨论】:

    【解决方案5】:

    我们来扮演侦探吧。

    我们将第一种方法称为条件箭头调用,第二种方法称为Traditional If Else

    我们将在jsperf 中创建两个单独的案例来评估这两种方法的公平性。

    条件箭头调用

    const VALUE = true;
    const TEST = false;
    
    //test 1
    VALUE && !TEST && (() => {
        console.log('print me!');
    })();
    

    Ops/sec 结果:

    1. 火狐:65,152
    2. 铬:129,045

    传统的 If Else

    const VALUE = true;
    const TEST = false;
    
    //test 2
    if(VALUE && !TEST) {
        console.log('print me!');
    }
    

    Ops/sec 结果:

    1. 火狐:65,967
    2. 铬:130,499

    结论

    如您所见,在性能方面并没有太大差异,但在大多数情况下,Traditional If Else 以微不足道的一小部分胜过条件箭头调用。这可能与动态创建隐式函数有关。

    我还意识到 Chrome 的 JavaScript 比 FireFox 的 JavaScript 执行快很多。

    这里是 jsperf 链接,您可以运行它来自行评估。

    https://jsperf.com/conditional-methods-vs-traditional-if-else/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多