2016-03-11 52 views
6

Tworzę małe narzędzie do kompilowania bloku javascript za pomocą C#. Próbuję zrozumieć przepływ wykonawczy operatora potrójnego. Teraz gdy używam javascript używając Chrome lub Firefoksa:JavaScript potrójny wynik operatora

var k = 27; 
var o = 78; 
var a = k < 100 ? o+=2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

Należy mieć dać mi prowadzić "T" lub "F" jeśli "o + = 2" zwraca false. Ale zamiast nich zwraca "78F". Czy ktoś może mi wyjaśnić, jaka jest logika, która za tym stoi.

+11

Polecam NIE gniazdowania operatorów trójskładnikowych. Chociaż zawsze jest miło mieć jedno-liniowy, o wiele łatwiej jest zrozumieć innych programistów, jeśli podzielisz to na instrukcje if-else. Musiałem kiedyś pracować nad aplikacją z maksymalnie 6 zagnieżdżonymi trzema fragmentami.To była bestia do debugowania. – HockeyJ

+1

użyj nawiasów klamrowych '(' i ')', aby rozróżnić wyrażenia i ułatwić wszystkim oczy. Prawdopodobnie da ci to również pożądany rezultat. – Aukhan

+1

Zagnieżdżanie potrójnych jest strasznym pomysłem .. – rlemon

Odpowiedz

9

podstawie operator precedence table:

operatory przypisania ma mniejszy priorytet niż operator porównania.

Tak Twój kod będzie oceniana jak poniżej,

  1. var a = k < 100? o + = 2> 11? "T": "F": o < 100? "J": "P";
  2. var a = true? o + = 2> 11? "T": "F": o < 100? "J": "P";
  3. var a = true? o + = false? "T": "F": o < 100? "J": "P";
  4. var a = true? o + = "F": o < 100? "J": "P";
  5. var a = true? "78F": o < 100? "J": "P";
  6. var a = "78F"

I można rozwiązać ten problem poprzez grupowanie warunek używając nawiasów,

var a = (k < 100) ? (o+=2) > 11 ? "T" : "F" : (o < 100) ? "J" : "P"; 
console.log(a); // T 
1

Używasz += na o zamiast tylko +.

var a = k < 100 ? o+2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 

również za pomocą nawiasów będzie bardziej czytelny:

var a = (k < 100 ? (o+2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P")); 
3
var k = 27; 
var o = 78; 
var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

Powyższy kod działa zgodnie z oczekiwaniami przez Ciebie. Prawdopodobnie pomyślałeś, że operator += zostanie przetworzony jako pierwszy.

1

to rzeczywiście działa jak k < 100 ? o += (2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P");

bo coś po prawej stronie operatora przypisania = jest przetwarzany najpierw w lewej do prawej, tak 2 > 11 ? "T" : "F" ocenia najpierw