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
Wenn Sie JavaScript Vorrang Operatoren betrachten, haben assignments
eine niedrigere Priorität als conditional operator
aber laut ecmascript specs, Par. 11.12
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% Das ist eine abgekürzte if else
Aussage
Das lange Formular wäre
%Vor%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.
Der bedingte Operator ist definiert als:
%Vor% a = b
ist eine Zuweisungsexpression und dies gilt auch für c = d = e
.
Tags und Links javascript conditional expression