JavaScript – M+T Pocket . Das Programmier-Handbuch (Office Einzeltitel) [Taschenbuch]

6.6
Ausdrücke, Operatoren, Operanden und Wertzuweisungen

Ein Kernbegriff in der Programmierung ist Ausdruck, dessen einziges wichtiges Kennzeichen ist, dass er einen Wert besitzt oder
repräsentiert. Im einfachsten Fall besteht ein Ausdruck nur aus einem Literal
oder einer Variable. In diesem trivialen Fall ist der Wert des Ausdrucks identisch
mit dem Literal oder dem Wert der Variablen.

Es gibt aber auch zusammengesetzte Ausdrücke. In diesem Fall
werden Literale und/oder Variablen miteinander verknüpft, d.h. es wird eine
Berechnung (im weitesten Sinn) durchgeführt. Der Wert des Ausdrucks ist dann
das Ergebnis der Verknüpfung. Die Verknüpfung selbst erfolgt über so genannte
Operatoren. Dies sind besondere Zeichen oder Zeichenkombination, die eine
auszuführende Handlung mit einer oder mehreren Variablen oder konstanten Werten
(also Literalen) ausführen. Diese so verknüpften Elemente werden Operanden genannt. In der Regel werden Operatoren in verschiedene Kategorien eingeteilt.

6.6.1
Arithmetische Operatoren

Arithmetische Operatoren benutzen zwei numerische Operanden (Zahlen oder Variablen mit numerischem Inhalt)
und verbinden diese so, dass auf Grund der Verknüpfung ein neuer Wert
zurückgegeben wird. Es gibt in JavaScript folgende arithmetischen Operatoren:

Operator

Beschreibung

+

Additionsoperator

Subtraktionsoperator

*

Multiplikationsoperator

/

Divisionsoperator

%

Modulooperator

Tabelle 6.8: Die arithmetischen Operatoren von
JavaScript

Ein Beispiel zeigt die Operatoren im Einsatz.

<HTML>

<HEAD>

<SCRIPT
language="JavaScript">

document.write("1 + 1 = ", 1+1
+ "<br>");

document.write("2 * 2 = ", 2*2
+ "<br>");

document.write("4 / 3 = ", 4/3 +
"<br>");

document.write("Beachten Sie, was Division durch
0 ergibt: ", 5/0 + "<br>");

document.write("6 – 5 = ", 6-5
+ "<br>");

document.write("12 % 7 = ", 12
% 7 + "<br>");

document.write("123579 % 7532 =
", 123579 % 7532);

</SCRIPT>

</HEAD>

<BODY></BODY>

</HTML>

Listing 6.10: Verschiedene arithmetische
Operationen

Beachten Sie, dass bei arithmetischen Operationen, welche
mathematisch »unendlich« ergeben, ein wohldefinierter Wert Infinity
zurückgegeben wird. Diesen Wert kann man mit geeigneten JavaScript-Funktionen
sinnvoll nutzen.

414 268
/op1

6.17: Arithmetische Operationen

Einstellige arithmetische Operatoren sind Spezialfälle der
gerade genannten arithmetische Operatoren. Es gibt davon zwei. Sie verwenden
nur einem Operanden, der dem Operator nachgestellt wird und sind ziemlich
selbsterklärend. Der Operator
– ist die einstellige arithmetische Negierung, welche die
arithmetische Vorzeichenumdrehung ihres nachfolgenden numerischen Operanden
ergibt und der Operator + ist
nur aus Symmetriegründen vorhanden.

6.6.2 Zuweisungsoperatoren und Wertzuweisung

Was eine Wertzuweisung ist, ist bekannt (siehe Seite 104). Zuweisungsoperatoren sind die Grundlage jeder
solchen Wertzuweisung. Sie weisen das Ergebnis einer auf der rechten Seite
stehenden Operation (damit ist auch die einfache Notation eines konstanten
Werts gemeint) der linken Seite des Ausdrucks zu. In den meisten Fällen wird
dazu der direkte Zuweisungsoperators = verwendet, aber es gibt noch andere
Zuweisungsoperatoren. Bevor wir diese aber kennenlernen, wollen wir eine
Wertzuweisung besprechen, die Einsteigern[15]
immer wieder Kopfzerbrechen bereitet. Was bedeutet die folgende Zeile, wenn a eine Variable
ist?

a = a + 1;

Mathematisch gesehen kann das doch nicht stimmen, oder? Wenn
man entsprechend der mathematischen Logik die Variable a durch Zahlen ersetzt, würde das

1 = 2;

oder auch

42 = 43;

bedeuten. Der Denkfehler ist, dass die hier notieren Zeilen
keinen Vergleich (!) darstellen, sondern eben eine Wertzuweisung, die man auch
in zwei aufeinander folgende, logische Schritte zerlegen kann. Die Zeile

a = a + 1;

kann so zerlegt werden (mit zwei Variablen):

b = a + 1;

a = b;

Der Wert von a wird um den Wert 1 erhöht und dann der Variablen b zugewiesen. Dann
wird der Wert von b
genommen und a zugewiesen.

Neben dem normalen Zuweisungsoperator = gibt es in JavaScript die
arithmetischen Zuweisungsoperatoren. Es handelt sich nur um die verkürzte Schreibweise einer arithmetischen Zuweisung. Wie auch die
arithmetischen Operatoren, können sie sowohl mit ganzen Zahlen als auch mit
Fließkommazahlen verwendet werden. Es gibt folgende arithmetische
Zuweisungsoperatoren:

Operator

Beschreibung

+=

Additions- Zuweisungsoperator

-=

Subtraktions-Zuweisungsoperator

*=

Multiplikations- Zuweisungsoperator

/=

Divisions- Zuweisungsoperator

%=

Modulo- Zuweisungsoperator

Tabelle 6.9: Die arithmetischen
Zuweisungsoperatoren von JavaScript

Die Zuweisung a += 2; entspricht a = a + 2; und a *= 2; entspricht a = a * 2;.

<HTML>

<HEAD>

<SCRIPT
language="JavaScript">

var a=1;

document.write("Startwert: " +
a + "<BR>");

a +=7;

document.write("a +=7: " + a +
"<BR>");

a -=3;

document.write("a -=3: " +a +
"<BR>");

a *=6;

document.write("a *=6: " + a +
"<BR>");

a /=3;

document.write("a /=3: " + a +
"<BR>");

a %=4;

document.write("a %=4: " + a +
"<BR>");

</SCRIPT>

</HEAD>

<BODY></BODY>

</HTML>

Listing 6.11: Verschiedene arithmetische
Zuweisungsakionen

202 363
/op2

6.18: Arithmetische Zuweisungen

6.6.3
Inkrement-/Dekrement-Operatoren

In engem Bezug zu Wertzuweisungen stehen die sogenannten
Inkrement-/Dekrement-Operatoren. Diese werden zum Auf- und Abwerten eines
einzelnen Wertes verwendet. Inkrement- und Dekrement-Operatoren sind
einstellige Operatoren und werden nur in Verbindung mit einem ganzzahligen oder
einem Fließkommaoperanden benutzt. Der Inkrement-Operator ++ erhöht den Wert des Operanden um 1. Die Syntax ++zaehler;
entspricht zaehler =
zaehler + 1; oder auch zaehler+=1;. Es bedeutet also, dass der
Wert der voranstehenden Variablen um eins erhöht wird und dann der Variablen
wieder zugewiesen wird. Beachtet werden sollte, dass der Operator der Variablen
auch nachgestellt werden kann. Die Reihenfolge von Operand und Operator ist
dabei relevant! Wenn der Operator vor dem Operanden steht, erfolgt die Erhöhung
des Wertes, bevor der Wert dem Operanden zugewiesen wird. Wenn er hinter dem
Operanden steht, erfolgt die Erhöhung, nachdem der Wert bereits zugewiesen
wurde.

<HTML>

<HEAD>

<SCRIPT
language="JavaScript">

var a=1;

var b=1;

document.write(

"Wert von a: " + a + ". Wert von b:
" + b + ".<BR>");

document.write("Wert von ++a: " + ++a

+ ". Wert von b++: " + b++ +
".<BR>");

document.write("Wert von a: " + a + ".
Wert von b: "

+ b + ".<BR>");

</SCRIPT>

</HEAD>

<BODY></BODY>

</HTML>

Listing 6.12: Inkrement vor- und nachgestellt

397 235
/op3

6.19: Einmal wird erhöht und ausgegeben und
einmal ausgegeben und erst dann erhöht

Das Beispiel zeigt, dass eine Variable mit nachgestelltem
Operator erst ausgegeben wird und dann die Erhöhung erfolgt, während bei
vorangestelltem Operator die Erhöhung vor der Ausgabe durchgeführt wird.

Der Dekrementoperator — ist der Gegenspieler vom
Inkrement-Operator. Er erniedrigt den Wert des Operanden um 1. Ansonsten ist
alles identisch zum Inkrement-Operator. Die Reihenfolge von Operand und
Operator ist auch hier relevant. Wenn der Operator vor dem Operanden steht,
erfolgt die Erniedrigung des Wertes, bevor der Wert dem Operanden zugewiesen
wird. Wenn er hinter dem Operanden steht, erfolgt die Erniedrigung, nachdem der
Wert bereits zugewiesen wurde.

6.6.4
Vergleichsoperatoren

Vergleichsoperatoren gehören zu den wichtigsten Operatoren.
Sie verwenden zwei Operanden und vergleichen diese. JavaScript kennt die
nachfolgenden Vergleichsoperatoren:

Operator

Beschreibung

==

Gleichheitsoperator

!=

Ungleichheitsoperator

===

Strikter Gleichheitsoperator

!==

Strikter Ungleichheitsoperator

<

Kleiner-als-Operator

>

Größer-als-Operator

<=

Kleiner-als-oder-gleich-Operator

>=

Größer-als-oder-gleich-Operator

Tabelle 6.10: Die Vergleichsoperatoren von
JavaScript

Die beiden strikten Operatoren (=== und !==) werden in früheren
JavaScript-Versionen nicht unterstützt. Die beiden Operatoren kontrollieren
nicht nur, ob Werte bei einem Vergleich übereinstimmen, sondern ob auch – im
Fall von Objekten – die Objekte vollkommen übereinstimmen. Das kleine Beispiel
zeigt die Unterschiede zu den normalen Vergleichsoperatoren.

<HTML>

<SCRIPT
language="JavaScript">

var testText = "Andrea";

var text2 = new String(testText);

if (testText==text2)

document.write("Werte
gleich");

if (testText===text2)

document.write("Vollkommen identisch");

</SCRIPT>

<BODY>

</BODY>

</HTML>

Listing 6.13: Unterschied von Gleichheit und
strikter Gleichheit

Zuerst wird eine Stringvariable mit einem Wert belegt. Dann
wird mit diesem String unter Verwendung von new und dem String-Konstruktor ein neues String-Objekt mit
gleichem Inhalt erzeugt. Der erste Vergleich zeigt, dass die Werte in beiden
Variablen identisch sind, der zweite jedoch, dass die Variablen nicht strikt
gleich sind. Die Wert werden in zwei verschiedenen Speicherbereichen abgelegt.

Vergleichsoperatoren werden in Verbindung mit
Kontrollflussanweisungen verwendet. Dort werden Sie mehr Beispiele finden (siehe Seite 117).

Beachten Sie, dass der Gleichheitsoperator == (zwei ohne Leerzeichen hintereinander
notierte Gleichheitszeichen) nicht (!) mit dem Zuweisungsoperator = verwechselt
werden darf. Es ist ein oft gemachter Fehler, bei einem Vergleich den
Zuweisungsoperator zu notieren. Einige Sprachen verwenden für beide
Situationen nur das einfache Gleichheitszeichen.

Ein Spezialfall von Vergleichsoperatoren sind die logischen
Vergleichsoperatoren. Diese werden nur auf Boolesche (Wahrheits-) Operanden
angewandt. Meist (aber nicht immer) sind das Bedingungsüberprüfungen, deren
Ergebnisse logisch behandelt werden sollen. Etwa, wenn mehrere Bedingungen
verknüpft werden sollen. JavaScript kennt folgende logischen
Vergleichsoperatoren:

Operator

Beschreibung

&&

Der logische AND-Operator. Er verbindet logische
Ausdrücke mit einer UND-Beziehung.

||

Der logische OR-Operator. Er verbindet logische
Ausdrücke mit einer ODER-Beziehung.

!

Der logische NOT-Operator. Er dreht einen Wahrheitswert
um.

Tabelle 6.11: Die logischen Vergleichsoperatoren
von JavaScript

Für Beispiele mit AND und OR siehe
Seite
119. Hier folgt ein Beispiel mit
dem logischen Nicht-Operator.

<HTML>

<HEAD>

<SCRIPT
language="JavaScript">

var a = false

document.write("Wert von a:
" + a + "<br>");

document.write("Wert von !a:
" + !a);

</SCRIPT>

</HEAD>

<BODY></BODY>

</HTML>

Listing 6.14: Wirkung vom logischen Nicht-Operator

393 233
/op4

6.20: Der Wahrheitswert der Variablen wird
umgedreht

6.6.5
Der konditionale und der typeof-Operator

Unter dem konditionalen bzw. if-else-Operator
versteht man die Kombination der beiden Zeichen Fragezeichen und Doppelpunkt ? :. Der
Doppeloperator arbeitet mit drei Operanden. Die Operation benötigt einen
Booleschen Ausdruck vor dem Fragezeichen. Wenn er wahr liefert, wird der Wert
vor dem Doppelpunkt zurückgegeben, ansonsten der Wert hinter dem Doppelpunkt.
Der Operator ist eine Kurzschreibweise für ein if-else-Konstrukt, das bei den
Kontrollfluss-Anweisungen (siehe Seite 117) intensiver behandelt wird. Dort finden Sie auch
ein Beispiel (siehe Seite 121).

Der in jeder Hinsicht außergewöhnliche Operator typeof ist ein unitärer Operator, den den Datentyp des nachgestellten Operanden in Form einer
Zeichenkette zurückliefert. Dabei kann

number,


boolean,


string,


undefined,

function
oder

object

als Ergebnis angegeben werden.

<HTML>

<BODY>

<SCRIPT
language="JavaScript">

var a = 2;

var b = true;

var c = new Date();

var d;

var e = "Felix";

var f = 3.14;

function test() {

return 1;

}

document.write("Wert von a: " + a + ".
Datentyp: "

+ typeof a + ".<br>")

document.write("Wert von b: " + b + ".
Datentyp: "

+ typeof b + ".<br>")

document.write("Wert von c: " + c + ".
Datentyp: "

+ typeof c + ".<br>")

document.write("Wert von d: " + d + ".
Datentyp: "

+ typeof d + ".<br>")

document.write("Wert von e: " + e + ".
Datentyp: "

+ typeof e + ".<br>")

document.write("Wert von f: " + f + ". Datentyp: "

+ typeof f + ".<br>")

document.write("Wert von test():
" + test()

+ ". Datentyp: " + typeof
test() + ".<br>")

document.write("Wert von test:
" + test

+ ". Datentyp: " + typeof
test + ".<br>")

</SCRIPT>

</BODY>

</HTML>

Listing 6.15:Typ der Variablen

Beachten Sie in dem Beispiel insbesondere die letzten beiden
Ausgaben. Dort wird einmal die Funktion mit Klammern und einmal ohne Klammern
verwendet. Der Typ mit Klammern ist derjenige des Rückgabewerts, der ohne
Klammern ist function.

401 274
/op6

6.21: Wert und Datentyp gegenübergestellt

Der typeof-Operator
kann gut dazu genutzt werden, zu testen, ob eine Variable überhaupt definiert
wurde. Wenn man den Wert undefined
bei einem Test erhält, ist ihr entweder noch kein Wert zugewiesen oder aber es
gibt sie noch gar nicht.

6.6.6
Bitweise Operatoren

Die bitweisen Operatoren wollen wir hauptsächlich der
Vollständigkeit angeben. Sie sind recht kompliziert und werden nicht oft in
Scriptsprachen eingesetzt. Dennoch – JavaScript stellt wie viele andere
mächtige Programmiersprachen Operatoren zur Verfügung, die auf Ebene der Bits
arbeiten. Beispielsweise bitweise arithmetische Operatoren, welche direkt
Bitwerte verändern. Oder bitweise Verschiebungsoperatoren, welche die Bits in
der binären Darstellung eines Zeichens verschieben. Die Bits des ersten
Operanden werden um die Anzahl an Positionen verschoben, die im zweiten
Operanden angegeben wird. Im Fall der Verschiebung nach links ist es immer eine
Null, mit der die rechte Seite aufgefüllt wird. Dieser Vorgang entspricht dem
Multiplizieren mit 2
hoch der Zahl, die durch den zweiten Operanden definiert wird. Der normale
Verschiebungsoperator nach rechts vervielfacht das Vorzeichenbit. Dieser
Vorgang entspricht der Division durch 2 hoch der Zahl, die durch den zweiten
Operanden definiert wird. Die Verschiebung nach rechts mit Füllnullen
vervielfacht eine Null von der linken Seite.

Operator

Beschreibung

&

Bitweiser AND-Operator

|

Bitweiser OR-Operator

^

Bitweiser XOR-Operator

~

Bitweiser Komplement-Operator

<<

Bitweise Verschiebung nach links.

>>

Bitweise Verschiebung nach rechts.

>>>

Bitweise Verschiebung nach rechts mit Füllnullen.

Tabelle 6.12: Bitweise Operatoren

Der bitweiser Komplement-Operator unterscheidet sich massiv
von den anderen genannten bitweisen Operatoren, denn Komplementieren ist eine
einstellige bitweise Operation mit nachgestelltem Operanden (im Gegensatz zu
den anderen Operationen, welche zweistellig sind). Wenn ein Byte komplementiert
wird, werden alle seine Bits invertiert.

JavaScript kennt auch bitweise Zuweisungsoperatoren und
bitweise Vergleichsoperatoren. Bitweise Zuweisungsoperatoren führen wie normale
Zuweisungsoperatoren Zuweisungen mit – jetzt bitweise zu verstehenden –
Operationen durch. Bitweise Zuweisungsoperatoren verwenden einen Wert, führen
eine entsprechende bitweise Operation mit dem zweiten Operanden durch und legen
das Ergebnis als Inhalt des ersten Operanden ab.

Bitweise Vergleichsoperatoren vergleichen binär zwei
Operanden.

Operator

Beschreibung

&=

Bitweise AND-Zuweisung.

|=

Bitweise OR-Zuweisung.

^=

Bitweise XOR-Zuweisung.

<<=

Bitweise Verschiebungszuweisung nach links.

>>=

Bitweise Verschiebungszuweisung nach rechts.

>>>=

Bitweise Verschiebungszuweisung nach rechts mit
Füllnullen.

Tabelle 6.13: Bitweise Zuweisung und Vergleich

6.6.7
Operatoren-Prioritäten

Operatoren in JavaScript haben eine festgelegte Rangordnung,
die immer dann angewandt wird, wenn mehrere Operatoren in einer Anweisung
verwendet werden. Die Prioritäten der JavaScript-Operatoren sind in der
nachfolgenden Tabelle von der höchsten Wertigkeit bis zur niedrigsten abwärts
angegeben. Bei gleicher Wertigkeit von Operatoren in einer Anweisungszeile
(etwa bei Vergleichsoperatoren) erfolgt die Bewertung von links nach rechts.
Beachten Sie, dass Klammern die höchste Priorität haben und Sie deshalb mit
Klammernsetzen alle andere Prioritäten aufheben können. Zuweisungen haben
(außer der Aufzählung mit Kommata) die niedrigste Priorität, was nichts anderes
bedeutet, als dass ein Ausdruck auf der rechten Seite einer Zuweisung immer
erst vollständig ausgewertet wird, bevor die Zuweisung erfolgt.

Priorität

Operatoren

1

() []

2

! ~ – ++ — typeof

3

* / %

4

+ –

5

<< >> >>>

6

< <= > >=

7

== != === !==

8

&

9

^

10

|

11

&&

12

||

13

?:

14

= += -= <<= >>= &= ^= |=

15

,

Tabelle 6.14: Rangordnung von
JavaScript-Operatoren