2014-09-24 18 views
10

mi sono imbattuto in questo codice in Mithril.js:Perché `(stato == 1 && 3)` ha senso?

finish(state == 1 && 3) 

Per gli occhi il mio (Java/C del programmatore) sembra che dovrebbe sempre invocare finish(true) se state è 1 e finish(false) se state non è 1. Ma in realtà sembra fare finish(3) per il primo e finish(false) per quest'ultimo.

Qual è la logica dietro questo?

È questo idiomatico in JavaScript o è una cattiva idea? Per me è orribilmente oscuro.

+0

Se lo stato == 1, l 'espressione ha un valore di 3. – kennebec

risposta

8

È una caratteristica di JavaScript, & & e || gli operatori restituiscono sempre l'ultimo valore valutato.

+3

Quindi è l'equivalente di 'finitura (== stato 1 3:? False)', che IMO è tanto più chiaro? La crescente familiarità con JavaScript riduce l'oscurità dell'idioma dell'OP? –

+2

@LawrenceDol: sì, la familiarità rende più chiaro. Anche se '||' è usato più spesso, penso. In genere per valori predefiniti. ('a = a || 'default';' come prima riga di una funzione che accetta 'a' come parametro) – njzk2

8

In JavaScript, l'operatore && non impone il risultato a un valore booleano. E 'invece simile a:

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

Test del truthiness del lato sinistro, per poi tornare sia a destra quando truthy o l'altro a sinistra.

13

È possibile interpretare i gestori || e && del genere:

A || B 
→ A ? A : B 

    A && B 
→ A ? B : A 

Ma senza valutare A due volte.

4

Il confronto a && b restituisce effettivamente il valore dell'ultimo valore valutato nell'espressione e non true o false.

È possibile fare riferimento al spec:

La produzione LogicalANDExpression: LogicalANDExpression & & BitwiseORExpression è valutata come segue:

  1. Let Lref essere il risultato o f valutazione di LogicalANDExpression.
  2. Lasciate lval essere GetValue (lref).
  3. Se ToBoolean (lval) è falso, restituire lval.
  4. Lasciare rref essere il risultato della valutazione BitwiseORExpression.
  5. Restituire GetValue (rref).