2016-03-11 17 views
6

Sto facendo una piccola utility per compilare il blocco javascript usando C#. Sto cercando di capire il flusso di esecuzione dell'operatore ternario. Ora, quando sto facendo funzionare un javascript utilizzando Chrome o Firefox:Risultato operatore ternario Javascript

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

Esso dovrebbe avere dammi risulto "T" o"F" se "o + = 2" restituisce false. Ma invece di quelli restituisce "78F". Qualcuno può per favore spiegarmi qual è la logica dietro di esso.

+11

mi sento di raccomandare gli operatori ternari NON nidificazione. Anche se è sempre bello avere una sola linea, è molto più facile per gli altri sviluppatori capire se la dividi in istruzioni if-else. Una volta ho dovuto lavorare su un'applicazione con un massimo di 6 ternari nidificati in parti.Era una bestia da debellare. – HockeyJ

+1

usa le parentesi '(' e ')' per differenziare le espressioni e renderlo più facile agli occhi di tutti. Probabilmente ti darà anche il risultato desiderato. – Aukhan

+1

L'annidamento dei ternari è una pessima idea .. – rlemon

risposta

9

Sulla base del operator precedence table:

operatori assegnazione è minore priorità di un operatore di confronto.

Così il vostro codice sarà valutato come qui di seguito,

  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"

E si può correggere il comportamento raggruppando la condizione utilizzando una parentesi,

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

Si utilizza += su o invece di +.

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

anche utilizzando parentesi renderà più leggibile:

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); 

Sopra codice funziona come previsto da voi. Probabilmente hai pensato che l'operatore += sarebbe stato elaborato per primo.

1

Questo è in realtà lavorando come k < 100 ? o += (2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P");

perché nulla sul lato destro dell'operatore di assegnazione = viene elaborato per primo, in ordine da sinistra a destra, in modo da 2 > 11 ? "T" : "F" viene valutata prima