JavaScript/Operatoren/Operatorenrangfolge
Unter den Operatoren von JavaScript gibt es eine festgelegte Rangordnung. Wenn Sie komplexe Rechenoperationen durchführen oder mehrere Bedingungen miteinander verknüpfen, gilt bei der internen Auflösung solcher komplexen Ausdrücke die folgende Rangordnung (Rang 1 ist der niedrigste Rang):
Rangstufe | Operator | L/R | Hinweis |
---|---|---|---|
1 | , |
L | Aneinanderreihung |
2 | = | R | Zuweisungen |
3 | ?: |
R | Entweder-Oder-Bedingung |
4 | || |
L | Logisches Oder |
5 | && |
L | Logisches Und |
6 | | |
L | Bitweises Oder |
7 | ^ |
L | Bitweises XOR |
8 | & |
L | Bitweises Und |
9 | == != === !== |
L | Identität und strikte Identität |
10 | < <= > >=
|
L | Kleiner, Größer
Existenzprüfung, Klassenprüfung |
11 | + - |
L | Addition und Subtraktion |
12 | * / % |
L | Multiplikation, Division und Rest |
13 | ** |
R | Potenzierung |
14 | ! ~ + - ++ --
|
Präfixoperatoren (Negation, Bitkomplement, unäres + und -, Präfix-Inkrement und -Dekrement | |
15 | ++ -- |
Postfix-Inkrement und -Dekrement | |
16 | new |
new-Operator ohne Argumente | |
17 | . ?. [] |
L | Objektzugriff, Optionaler Objektzugriff |
[] () new() |
Array- oder ObjektZugriff, Funktionsaufruf, new-Operator mit Argumenten | ||
18 | ( ... ) |
Gruppieren in Ausdrücken |
Mit Hilfe von gruppierenden Klammern können Sie die Rangfolge bei den Operatoren beeinflussen und Ausdrücke so bewerten, wie Sie es wünschen.
var OffizielleStatistik = 3.29 * 3 + 4.71;
var MeineStatistik = 3.29 * (3 + 4.71);
Das Beispiel zeigt, wie Sie durch Setzen von Klammern das Ergebnis einer Rechenoperation beeinflussen können. Ob man mit Klammern gruppieren oder eine Funktion aufrufen will, wird normalerweise aus dem Zusammenhang heraus klar.
Assoziativität
Neben der Rangfolge ist bei Operatoren auch die Assoziativität oder Auswertungsreihenfolge zu beachten, angegeben in der Spalte "L/R". Normalerweise werden gleichrangige Operatoren von links nach rechts ausgewertet ("links-assoziativ"). Für "2+3+4" wird also erst 2+3 bestimmt und dann auf das Ergebnis 4 addiert. Die Zuweisungsoperatoren und der Potenzoperator werden dagegen von rechts nach links ausgewertet ("rechts-assoziativ"), {dh} bei "a=b=c" wird zuerst c nach b übertragen und dann b nach a.
Die unären Operatoren sind implizit rechts-assoziativ, ein Ausdruck wie ~++a lässt sich nicht anders auswerten. Er inkrementiert zunächst a und negiert dann (bitweise) das Ergebnis. Der Vorrang der Postfix- vor den Prefix-Operatoren bewirkt, dass der Ausdruck ~a++ ebenfalls a inkrementiert bevor negiert wird. Weil a++ den alten Wert von a liefert, wird diesmal aber der negierte alte Wert zum Ergebnis des Ausdrucks.
Für PHP Kenner verwirrend ist diese Reihenfolge bei dem ?: Operator. Und zwar deshalb, weil ihn PHP merkwürdigerweise von links nach rechts auswertet. Dem Vorbild C getreu ist die Auswertung von rechts nach links. Das Setzen von Klammern ist hier bei geschachtelten ?: Operatoren empfehlenswert.
// Interpretiert als x == "a" ? 1 : (x == "b" ? 2 : 3);
var a = x == "a" ? 1 : x == "b" ? 2 : 3;
Javascript liefert 1 für x=="a", 2 für x=="b" und sonst 3
// Interpretiert als (x == "a" ? 1 : x == "b") ? 2 : 3;
$a = $x == "a" ? 1 : $x == "b" ? 2 : 3;
PHP liefert 2 für x=="a", 2 für x=="b" und sonst 3
Der Aneinanderreihungsoperator ,
,
darf nicht mit dem Komma verwechselt werden, das bei Funktionsaufrufen die Argumente voneinander trennt. Innerhalb der runden Klammern eines Funktionsaufrufs oder des new()
-Operators hat ein Komma zuerst die Bedeutung, die Argumente zu trennen. Möchten Sie an dieser Stelle den Aneinanderreihungsoperator nutzen, müssen Sie das betreffende Funktionsargument in Klammern setzen.