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 ,
Bei der Deklaration von Variablen kann es sinnvoll sein, diese mit dem Aneinandserreihungsoperator zu notieren:
const
a = 42,
b = "Fehler!",
c = istHeuteEinMontag();
for (let i = 0, j = 0; i < 4; i++) {
// Innerhalb der Schleife gibt es nun i und j als Variablen.
}
Ohne diesen Operator müsste man obigen Code so schreiben:
const a = 42;
const b = "Fehler!";
const c = istHeuteEinMontag();
let j = 0; // j gibt es nun auch außerhalb der Schleife.
for (let i = 0; i < 4; i++) {
// Innerhalb der Schleife gibt es i als lokale Variable,
// j dagegen als Variable aus dem äußeren Scope.
}
,
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.