Ijs2019medienpartner.jpg

SELFHTML ist in diesem Jahr Medienpartner der IJC.

Für die Konferenz vom 21. – 25. Oktober 2019 in München verlosen wir ein Freiticket.

Weitere Informationen finden sich im SELFHTML-Forum.

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:

  • JavaScript 1.0
  • Chrome
  • Firefox
  • IE
  • Opera
  • Safari
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 ! ~ - ++ -- typeof void delete R Präfixoperatoren
14 ++ -- Postfixoperatoren
15 () L Funktionsaufruf
16 . [] new L Objekt- und Tabellenzugriff, Erzeugen von Objekten
17 ( ... ) 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"), d.h. bei "a=b=c" wird zuerst c nach b übertragen und dann b nach a.

Sämtliche unäre Operatoren sind rechts-assoziativ, was bei einem Ausdruck wie ~++a wichtig ist. 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 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.

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