2016-03-11 27 views
6

Ich mache kleine Dienstprogramm, um JavaScript-Block mit C# zu kompilieren. Ich versuche den Ausführungsfluss des ternären Operators zu verstehen. Nun, wenn ich laufe ein Javascript mit Chrome oder Firefox:Javascript ternärer Operator Ergebnis

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

Es sollte mich "T" oder "F" wenn "o + = 2" geben führen false zurückgibt. Aber statt dieser gibt es "78F" zurück. Kann mir bitte jemand erklären, was die Logik dahinter ist.

+11

ich würde Verschachtelung ternäre Operatoren empfehlen. Während es immer schön ist, einen Einzeiler zu haben, ist es für andere Entwickler viel einfacher zu verstehen, wenn Sie dies in if-else-Anweisungen aufteilen. Ich musste einmal an einer Anwendung mit bis zu 6 verschachtelten ternären Teilen arbeiten.Es war ein Biest zum Debuggen. – HockeyJ

+1

verwenden Sie bitte Klammern '(' und ')', um Ausdrücke zu unterscheiden und es für jedermanns Augen zu erleichtern. Es wird höchstwahrscheinlich auch das gewünschte Ergebnis liefern. – Aukhan

+1

Nester ist eine schreckliche Idee .. – rlemon

Antwort

9

auf dem operator precedence table Basierend:

Zuweisungsoperatoren hat weniger Priorität als ein Vergleichsoperator.

So wird Ihr Code wie unten,

  1. var a = k < 100 ausgewertet werden? o + = 2> 11? "T": "F": 0 < 100? "J": "P";
  2. var a = true? o + = 2> 11? "T": "F": 0 < 100? "J": "P";
  3. var a = true? o + = false? "T": "F": 0 < 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"

Und Sie das Verhalten durch die Gruppierung der Bedingung mit einer Klammer korrigieren,

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

Du += auf o statt nur + verwenden.

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

auch Klammern verwendet, wird es besser lesbar machen:

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

obige Code funktioniert, wie von Ihnen erwartet. Sie dachten wahrscheinlich, dass der Operator += zuerst verarbeitet werden würde.

1

Dies funktioniert tatsächlich wie k < 100 ? o += (2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P");

weil alles auf der rechten Seite des Zuweisungsoperators = zuerst verarbeitet wird, in links nach rechts, so wird 2 > 11 ? "T" : "F" ausgewertet erste