2014-09-24 85 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)。