JavaScript/Operatoren/Operatorenrangfolge

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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 < <= > >=

in instanceof

L Kleiner, Größer

Existenzprüfung, Klassenprüfung

11 + - L Addition und Subtraktion
12 * / % L Multiplikation, Division und Rest
13 ** R Potenzierung
14 ! ~ + - ++ --

typeof void delete await

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.

Beispiel
    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.

Neben der Rangfolge ist bei Operatoren auch die 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 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.

Javascript
// 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
PHP
// 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
Beachten Sie: 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.
Empfehlung: Vermeiden Sie den Gebrauch des Aneinanderreihungsoperators. Er ist ein Erbstück der Programmiersprache C, wo er genutzt wurde, um besonders kompakten Quellcode erstellen zu können. Er kann aber auch zu überraschenden Konsequenzen führen, vor allem bei der Kurzschlussauswertung von logischen Operatoren. Er ist für Tools zur Codeverkleinerung und -verschleierung (Minifikatoren und Obfuskatoren) nützlich, aber Sie sollten Ihren Quellcode so schreiben, dass er ohne langes Nachdenken über Rangfolgen, Assoziativitäten und Kurzschlüsse verstanden werden kann. Überlassen Sie die Code-Optimierung der JavaScript-Engine des Browsers. Und wenn Sie Ihren Sourcecode klein halten wollen, um das Datenvolumen Ihrer Website zu reduzieren, dann nutzen Sie Tools zum Bündeln und Minifizieren.