2014-09-24 53 views
10

我碰到这个代码Mithril.js传来:为什么`(state == 1 && 3)`有意义?

finish(state == 1 && 3) 

要我(的Java/C程序员的)眼睛看起来它应该始终调用finish(true)如果state1finish(false)如果state1。但实际上似乎做finish(3)对于前者,finish(false)后者。

这背后有什么逻辑?

这是习惯在JavaScript,或者是一个坏主意?对我来说,这是非常晦涩难懂的。

+0

如果状态== 1,则表示有3 – kennebec 2014-09-24 19:49:10

回答

8

它是JavaScript的一个特性,& &和||操作员总是返回它评估的最后一个值。

+3

值所以这是'完成(状态== 1→3:FALSE)相当于',它IMO是如此清楚得多?增加对JavaScript的熟悉程度是否会减少OP惯用语的模糊程度? – 2014-09-24 20:15:18

+2

@劳伦斯多尔:是的,熟悉使它更清晰。尽管我经常使用'||'。通常用于默认值。 ('a = a ||'default';'作为以'a'作为参数的函数的第一行) – njzk2 2014-09-24 20:23:05

8

在JavaScript中,&&操作者不对结果迫使一个布尔值。这是不是类似于:

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

测试左侧的感实性,然后返回无论是权当truthy或左其他。

13

可以解释运营商||&&这样的:

A || B 
→ A ? A : B 

    A && B 
→ A ? B : A 

但是,如果没有评估A两次。

4

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

您可以参考spec

生产LogicalANDExpression

  1. LREF是结果:LogicalANDExpression & & BitwiseORExpression如下评价Ø ˚F评估LogicalANDExpression
  2. lval成为GetValue(lref)。
  3. If ToBoolean(lval)is false,return lval
  4. rref是评估结果BitwiseORExpression
  5. Return GetValue(rref)。