komplizierter javascript-bedingter Ausdruck

9

Was ist der richtige Weg, um diesen komplizierten Javascript-Ausdruck zu interpretieren?

some_condition ? a = b : c = d = e;

Nach den Vorrangregeln des Operators würde ich Folgendes erwarten:

(some_condition ? a = b : c) = d = e;

Aber es scheint, dass die Gruppierung tatsächlich ist:

EDIT: (Die ursprüngliche Gruppierung war unklar. Siehe unten für Update)

BEARBEITEN: some_condition ? a = b : (c = d = e);

Warum ist das so? (Und nein, ich habe diesen Code nicht geschrieben)

BEARBEITEN: Dies scheint darauf hinzuweisen, dass in Javascript ?: eine höhere Priorität hat als = nicht ganz richtig ist. Als ein weiteres Beispiel:

x = y ? a = b : c = d = e;

Wenn ?: eine höhere Priorität hat als = (wie in C), dann wäre die Gruppierung

x = ((y ? a = b : c) = (d = e));

sondern (von den Antworten) was wir haben ist

x = (y ? a = b : (c = d = e));

Der relative Vorrang von ?: und = hängt anscheinend von ab, wobei im Ausdruck

vorkommen     
tyty 02.04.2012, 15:43
quelle

6 Antworten

3

Wenn Sie JavaScript Vorrang Operatoren betrachten, haben assignments eine niedrigere Priorität als conditional operator aber laut ecmascript specs, Par. 11.12

%Vor%

Der Bedingungsoperator wertet also den Code aus, der jeden Zuweisungsausdruck gruppiert, und er funktioniert, wie jeder erklärt hat.

Vielleicht könnte ich hier falsch liegen, aber ich denke, dass die Rangfolge der Operatoren sich darauf bezieht, wie js einen Ausdruck wie

analysiert %Vor%

(und nicht in den AssignmentExpressions enthalten) In diesem Szenario sollte die Zuweisung eine niedrigere Priorität haben, daher bewertet Javascript die gesamte Anweisung als

%Vor%     
fcalderan 02.04.2012 16:01
quelle
2

Das ist eine abgekürzte if else Aussage

Das lange Formular wäre

%Vor%     
Simon West 02.04.2012 15:48
quelle
0
%Vor%     
Creynders 02.04.2012 15:48
quelle
0

var result = true ? a=b : c=d=e;

Wenn es wahr ist a ist gleich b und Ergebnis gleich b

var result = false ? a=b : c=d=e;

wenn es falsch ist, ist d gleich e, c ist auch gleich e und das Ergebnis ist e

    
Du D. 02.04.2012 15:54
quelle
0

Sie finden vielleicht auch diese Definition des ternären Operators hilfreich.

Normalerweise würde dies verwendet werden, um etwas basierend auf der Bedingung zuzuweisen, aber dieses scheint nur a oder c und d basierend auf der Bedingung zu ändern.

Ich sehe häufig Dinge wie val = isConditionTrue ? trueVal : falseVal; Dann kann val entweder trueVal oder falseVal basierend auf isConditionTrue sein.

    
kiswa 02.04.2012 15:55
quelle
0

Der bedingte Operator ist definiert als:

%Vor%

a = b ist eine Zuweisungsexpression und dies gilt auch für c = d = e .

    
zzzzBov 02.04.2012 16:04
quelle