为什么`(state == 1&& 3)`有意义?

时间:2014-09-24 19:41:39

标签: javascript

我在Mithril.js中看到了这段代码:

finish(state == 1 && 3)

对于我的(Java / C程序员)来说,如果finish(true)state,则应始终调用1finish(false) state }}不是1。但它实际上似乎对前者finish(3)和后者finish(false)

这背后的逻辑是什么?

这是JavaScript中的惯用语,还是一个坏主意?对我而言,这是非常模糊的。

4 个答案:

答案 0 :(得分:13)

您可以像这样解释运算符||&&

    A || B
→   A ? A : B

    A && B
→   A ? B : A

但未评估A两次。

答案 1 :(得分:8)

在JavaScript中,&&运算符不会将结果强制为布尔值。它反而类似于:

var _temp = state == 1;
finish(_temp ? 3 : _temp);

测试左侧的真实性,然后在 truthy 时返回右侧,否则返回左侧。

答案 2 :(得分:8)

这是JavaScript的特点,&&和||运算符总是返回它评估的最后一个值。

答案 3 :(得分:4)

比较a && b实际上返回表达式中评估的最后一个值的值,而不是truefalse

您可以参考spec

  

生产 LogicalANDExpression LogicalANDExpression &&    BitwiseORExpression 评估如下:

     
      
  1. lref 成为评估 LogicalANDExpression 的结果。
  2.   
  3. lval 为GetValue( lref )。
  4.   
  5. 如果ToBoolean( lval )为false,则返回 lval
  6.   
  7. rref 成为评估 BitwiseORExpression 的结果。
  8.   
  9. 返回GetValue( rref )。
  10.