2014-09-24 13 views
10

Ich kam in diesem Code in Mithril.js:Warum macht `(state == 1 && 3)` Sinn?

finish(state == 1 && 3) 

Zu meiner (Java/C Programmierers) Augen sieht es aus wie es immer finish(true) wenn state ist 1 und finish(false) wenn state nicht 1 ist aufrufen sollte. Aber es scheint tatsächlich finish(3) für das ehemalige und finish(false) für das letztere zu tun.

Was ist die Logik dahinter?

Ist diese Idiomatik in JavaScript oder ist es eine schlechte Idee? Für mich ist es schrecklich dunkel.

+0

Wenn Zustand == 1, der Ausdruck ein Wert von 3 hat – kennebec

Antwort

8

Es ist eine Eigenschaft von JavaScript, & & und || Operatoren geben immer den letzten Wert zurück, den sie ausgewertet hat.

+3

So ist es das Äquivalent von 'Finish (state == 1 3:? False)', die IMO so viel klarer ist? Erhöht die zunehmende Vertrautheit mit JavaScript die Dunkelheit des OP-Idioms? –

+2

@LawrenceDol: Ja, Vertrautheit macht es klarer. Obwohl '||' öfter verwendet wird, denke ich. In der Regel für Standardwerte. ('a = a || 'default';' als erste Zeile einer Funktion, die 'a' als Parameter akzeptiert) – njzk2

8

In JavaScript erzwingt der Operator && das Ergebnis nicht auf einen booleschen Wert. Es ist stattdessen ähnlich wie:

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

Testen der Truthiness von der linken Seite, dann ist entweder das Recht zurückkehrt, wenn truthy oder die sonst verlassen.

A || B 
→ A ? A : B 

    A && B 
→ A ? B : A 

Aber ohne Bewertung A zweimal:

13

Sie können die Operatoren || und && so interpretieren.

4

Der Vergleich a && b gibt tatsächlich den Wert als letzten Wert zurück, der im Ausdruck ausgewertet wurde, und nicht true oder .

können Sie auf die spec verweisen:

Die Produktion LogicalANDExpression: LogicalANDExpression & & BitwiseORExpression wird wie folgt bewertet:

  1. Lassen Iref das Ergebnis O f Auswerten LogicalANDExpression.
  2. Lassen Sie lval GetValue sein (lref).
  3. Wenn ToBoolean (lval) falsch ist, geben Sie lval zurück.
  4. Lassen Sie rref das Ergebnis der Auswertung sein BitwiseORExpression.
  5. Rückgabe GetValue (rref).