Das AJAX Kompendium - *ISBN 978-3-8272-4418-5 ...
Das AJAX Kompendium - *ISBN 978-3-8272-4418-5 ...
Das AJAX Kompendium - *ISBN 978-3-8272-4418-5 ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Inhalt<br />
3 Programmieren<br />
1<br />
Spricht ein Experte lapidar vom Programmieren, bleibt immer die Frage,<br />
worum es dabei eigentlich geht. Eine Webanwendung stellt andere Anforderungen<br />
als eine Windows-Applikation oder ein VBA-Makro. Trotz der unterschiedlichsten<br />
Einsatzgebiete sind in vielen Programmiersprachen die<br />
Grundstrukturen gleich. In C#, Visual Basic, PHP und auch in JavaScript<br />
wird mit Variablen gearbeitet. Diese Variablen müssen mittels Operatoren<br />
miteinander verknüpft, Bedingungen müssen überprüft und Anweisungen<br />
ausgeführt werden. 1<br />
Sollten Sie bereits mit anderen Programmiersprachen vertraut sein, kommt<br />
Ihnen also vieles vertraut vor. Es ist ausreichend, wenn Sie einen Blick auf<br />
die Syntax werfen. Haben Sie dagegen noch keine Programmiererfahrung,<br />
lohnt sich eine ausführlichere Beschäftigung mit den Grundlagen in diesem<br />
Kapitel. Sie können später immer wieder darauf zurückgreifen.<br />
3.1 Operatoren<br />
Operatoren verbinden in Variablen gespeicherte Daten. Die verschiedenen<br />
mathematischen Rechenarten wie Addition, Subtraktion usw. haben jeweils<br />
eigene Operatoren. Für die Addition steht beispielsweise das Pluszeichen<br />
(+). Darüber hinaus gibt es noch weitere Operatoren, beispielsweise um<br />
zwei Werte miteinander zu vergleichen.<br />
Einen Operator haben Sie bereits kennen gelernt: den Zuweisungsoperator<br />
(das Ist-Gleich). Er weist einer Variablen einen Wert zu:<br />
var x = 5;<br />
3.1.1 Arithmetische Operatoren<br />
Die arithmetischen Operatoren sind für die mathematischen Grundrechenarten,<br />
beispielsweise Addition und Multiplikation, zuständig. Die Syntax ist<br />
sehr einfach. Folgende Zeile addiert 5 und 3 und weist das Ergebnis 8 der<br />
Variablen x zu.<br />
var x = 5 + 3;<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
1 Zugegeben, das ist nur ein kleiner Teil des Programmierens im weiteren Sinne. Für dieses Kapitel wird<br />
der Begriff sehr eng gefasst.<br />
75<br />
ndex
Programmieren<br />
Der Operator ist in diesem Fall das Plussymbol für die Addition. Die zwei<br />
Werte 5 und 3 werden als Operanden 2 bezeichnet.<br />
INFO<br />
In den Beispielskripten dieses Buches sind Operanden und Operatoren<br />
jeweils durch ein Leerzeichen getrennt. JavaScript erfordert dies nicht, allerdings<br />
werden die Skripten dadurch übersichtlicher.<br />
<strong>Das</strong> folgende Beispiel ist ein komplett lauffähiges Skript. Es rechnet einen in<br />
der Variablen dollar gespeicherten Geldwert von Dollar in Euro um und<br />
gibt ihn aus. Dazu wird die Variable dollar durch den Umrechnungskurs<br />
(Variable kurs) geteilt.<br />
Listing 3.1: Einfache Umrechnung von Dollar in Euro (euro.html)<br />
<br />
<br />
Euro in DM<br />
<br />
<br />
<br />
<br />
<br />
HALT<br />
Beachten Sie, dass der arithmetische Operator für die Division kein Doppelpunkt,<br />
sondern ein Schrägstrich (/) ist.<br />
Natürlich können auch mehrere arithmetische Operatoren hintereinander<br />
eingesetzt werden. Dabei gilt – wie in der »echten« Mathematik – die Regel<br />
»Punkt vor Strich«. <strong>Das</strong> heißt, Division und Multiplikation rangieren in der<br />
Präferenz vor Addition und Subtraktion. Ein einfaches Beispiel illustriert dies:<br />
Listing 3.2: Bei den arithmetischen Operatoren gilt Punkt vor Strich (punkt_vor_strich.html)<br />
<br />
<br />
Punkt vor Strich<br />
<br />
<br />
<br />
<br />
<br />
2 Frei übersetzt hieße das wohl: »Diejenigen, mit denen der Operator arbeitet«.<br />
76
Operatoren<br />
<strong>Das</strong> Beispiel besteht aus zwei Teilen:<br />
1. Im oberen Teil des Skripts wird die Variable x definiert. Sie erhält als<br />
Wert das Ergebnis einer Berechnung. Zuerst wird 200 durch 2 geteilt.<br />
<strong>Das</strong> Ergebnis (100) wird mit 100 addiert. Die Variable x erhält also den<br />
Wert 200, der anschließend ausgegeben wird.<br />
2. Der untere Teil des Skripts umgeht das Punkt-vor-Strich-Prinzip mit<br />
Klammern. Klammern sind im Prinzip auch Operatoren, die außerdem<br />
eine höhere Präferenz als arithmetische Operatoren besitzen. Im Beispiel<br />
rechnet der JavaScript-Interpreter zuerst 100 plus 200 und teilt das<br />
Ergebnis (300) anschließend durch 2. Ausgegeben wird dann 150 als<br />
Wert von y.<br />
Bisher kamen in den Beispielen nur Addition und Division vor. In der folgenden<br />
Tabelle finden Sie alle arithmetischen Operatoren im Überblick.<br />
Operator Beispiel Beschreibung<br />
+ x = 5 + 3; // Ergebnis: 8 Addition; Addieren zweier Zahlen.<br />
- x = 5 - 3; // Ergebnis: 2 Subtraktion; eine Zahl wird von der anderen<br />
subtrahiert.<br />
Tabelle 3.1:<br />
Die arithmetischen<br />
Operatoren<br />
1<br />
2<br />
3<br />
4<br />
5<br />
- x = 5;<br />
y = -x; //Ergebnis y: -5<br />
Negation mit vorangestelltem Minussymbol.<br />
Vorzeichenwechsel.<br />
6<br />
* x = 5 * 3; // Ergebnis: 15 Multiplikation; zwei Zahlen werden miteinander<br />
multipliziert.<br />
7<br />
/ x = 5 / 3; // Ergebnis: 1.6666 Division; eine Zahl wird mit der zweiten Zahl dividiert.<br />
% x = 5 % 3; // Ergebnis: 2 Modulo; ganzzahligen Rest einer Division errechnen;<br />
im Beispiel: 3 passt in 5 einmal, als Rest bleibt 2.<br />
Inkrement und Dekrement<br />
JavaScript hat einen eigenen Operator, das so genannte Inkrement, um<br />
einen Wert genau um 1 zu erhöhen. Er wird durch ein doppeltes Pluszeichen<br />
(++) symbolisiert und insbesondere bei Schleifen recht häufig zum<br />
Erhöhen des Zählers eingesetzt (siehe Abschnitt 3.3 »Schleifen«).<br />
var x = 2;<br />
x++;<br />
Diese zwei Zeilen definieren x zuerst mit dem Wert 2 und erhöhen x dann<br />
um 1 auf 3.<br />
<strong>Das</strong> Gegenstück zum Inkrement ist das Dekrement zum Verringern eines<br />
Werts um 1. Die Funktionsweise ist analog:<br />
var x = 2;<br />
x--;<br />
ergibt also den Wert 1 für x.<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
77
Programmieren<br />
Reihenfolge<br />
Bei Inkrement und Dekrement ist entscheidend, ob sie vor oder hinter der<br />
Variablen oder dem zu ändernden Wert stehen.<br />
++x;<br />
Stehen Sie wie in dieser Zeile vor der Variablen, wird zuerst der Variablenwert<br />
erhöht, bevor die Variable verwendet wird.<br />
var x = 5;<br />
var a = 3 + ++x;<br />
Bei diesen Zeilen hat also a den Wert 9 ( 3 + 5 + 1). x hat nach den zwei<br />
Zeilen den Wert 6.<br />
Steht das Inkrement oder Dekrement hingegen hinter der Variablen, wird<br />
deren Wert erst um eins erhöht oder gesenkt, wenn die Variable verwendet<br />
wurde:<br />
var x = 5;<br />
var a = 3 + x++;<br />
a hat hier also den Wert 8, x wie im vorhergehenden Beispiel den Wert 6.<br />
Kurzformen<br />
Inkrement und Dekrement sind zwar sehr praktisch, häufig soll der Wert<br />
einer Variablen allerdings nicht nur um 1 verändert werden. In der<br />
umständlicheren Variante sieht dies wie folgt aus:<br />
var x = 5;<br />
x = x - 3; //Ergebnis: 2<br />
Für die zweite Zeile gibt es allerdings auch eine elegantere Kurzform:<br />
x -= 3; //Ergebnis: 2<br />
Was geschieht hier? Der Operator wird vor das Pluszeichen geschrieben.<br />
<strong>Das</strong> signalisiert dem Interpreter, dass er den Variablenwert verändern soll.<br />
Um welchen Wert er verändert werden soll, steht nach dem Ist-Gleich.<br />
Diese Kurzform gibt es für alle arithmetischen Operatoren (siehe Tabelle 3.2).<br />
Tabelle 3.2:<br />
Kurzformen für<br />
arithmetische<br />
Operatoren<br />
Operator Beispiel (var x = 5) Längere Alternative<br />
+= X += 3; // Erg: 8 x = x + 3;<br />
-= X -= 3; // Erg: 2 x = x - 3;<br />
*= X *= 3; // Erg: 15 x = x * 3;<br />
/= X /= 3; // Erg: 1.6666 x = x / 3;<br />
%= X %= 3; // Erg: 2 x = x % 3;<br />
78
Operatoren<br />
3.1.2 String-Operator<br />
Natürlich lassen sich mit Zeichenketten keine Berechnungen anstellen.<br />
Dennoch gibt es einen Operator: das Plussymbol (+). Es verbindet mehrere<br />
Strings miteinander. Listing 3.2 macht davon bereits Gebrauch.<br />
Die Verknüpfung von Strings wird auch Konkatenation genannt.<br />
var titel = "Yesterday";<br />
var text = "all my trouble ...";<br />
document.write(titel + text);<br />
Die oberen Zeilen fügen den Anfang des Beatles-Klassikers »Yesterday«<br />
aneinander und geben ihn aus. Allerdings gibt es dabei ein Problem. Da<br />
keine Leerzeichen als Zwischenräume vorgesehen sind, wird der Text direkt<br />
aneinandergehängt (siehe Abbildung 3.1).<br />
INFO<br />
Abbildung 3.1:<br />
Der Browser hängt<br />
den Text direkt<br />
aneinander.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
Dieses Problem ist in der Praxis ein sehr häufiger Flüchtigkeitsfehler. Im<br />
Prinzip ist es unerheblich, ob Sie das Leerzeichen in den ersten oder zweiten<br />
String einfügen. Im Allgemeinen wirkt es allerdings im ersten übersichtlicher.<br />
Listing 3.3:<br />
Der String-Operator verknüpft zwei Zeichenketten (string_operator.html).<br />
<br />
<br />
String-Operator<br />
<br />
<br />
<br />
<br />
<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
79
Programmieren<br />
Abbildung 3.2:<br />
Jetzt ist der<br />
Abstand korrekt.<br />
Kurzform<br />
Für den String-Operator gibt es wie bei der normalen Addition die Kurzform<br />
+=. <strong>Das</strong> Beispiel sieht in der Kurzform mit nur noch einer Variablen wie folgt<br />
aus:<br />
var text = "Yesterday, ";<br />
text += "all my trouble…"<br />
document.write(text);<br />
3.1.3 Vergleichsoperatoren<br />
Vergleichen ist in der Programmierung gang und gäbe. Es werden keine<br />
»Äpfel mit Birnen«, sondern meistens Zahlen miteinander verglichen, um<br />
Bedingungen zu überprüfen. Bedingungen kommen insbesondere in Kontrollstrukturen<br />
und Schleifen zum Einsatz (siehe Abschnitt 3.2 »Kontrollstrukturen«<br />
und Abschnitt 3.3 »Schleifen«).<br />
Die Vergleichsoperatoren sind größtenteils ebenfalls bereits im Mathematikunterricht<br />
zum Einsatz gekommen. Folgende Zeile stellt beispielsweise fest,<br />
ob 4 größer als 3 ist.<br />
var v = (4 > 3);<br />
<strong>Das</strong> Ergebnis eines Vergleichs ist immer ein Wahrheitswert (Boolean), also<br />
true (wahr) oder false (falsch). In unserem Beispiel lautet das Ergebnis<br />
natürlich … true. Sie können das feststellen, indem Sie die Variable einfach<br />
ausgeben (siehe Abbildung 3.3).<br />
Abbildung 3.3:<br />
Die Ausgabe<br />
von 4 > 3<br />
(vergleich.html)<br />
80
Operatoren<br />
Eine vollständige Auflistung der Vergleichsoperatoren in JavaScript finden<br />
Sie in Tabelle 3.3.<br />
Operator Beispiel Beschreibung<br />
== var a = (4 == 3); //Erg: false Gleichheit<br />
Tabelle 3.3:<br />
Die Vergleichsoperatoren<br />
!= var a = (4 != 3); //Erg: true Ungleichheit<br />
1<br />
< var a = (4 < 3); //Erg: false Kleiner als<br />
3); //Erg: true Größer als<br />
>= var a = (4 >= 3); //Erg: true Größer als oder gleich<br />
2<br />
3<br />
Sind zwei Zahlen gleich groß, ergibt ein Vergleich mit < oder > immer false.<br />
Soll bei Gleichheit true zurückgegeben werden, müssen Sie = verwenden.<br />
Beachten Sie außerdem, dass der Vergleich auch Nachkommastellen<br />
berücksichtigt.<br />
Der Gleichheitsoperator == wird in der Praxis häufig mit dem Zuweisungsoperator<br />
= vertauscht. <strong>Das</strong> Problem ist, dass JavaScript-Interpreter in diesem Fall<br />
manchmal keine Fehlermeldung liefern. Die Schwierigkeit liegt also darin,<br />
das Problem zu lokalisieren (zur Fehlerkorrektur siehe Kapitel 29 »Debugging«).<br />
Datentypen<br />
Ist einer der Operanden keine Zahl, sondern ein anderer Datentyp, führt der<br />
JavaScript-Interpreter eine automatische Typkonvertierung durch:<br />
■ Ist einer der Operanden ein String und der andere eine Zahl, wird die<br />
Zahl in einen String umgewandelt.<br />
■ Ist einer der Operanden ein Wahrheitswert, wird true in 1 und false in<br />
0 umgewandelt.<br />
■ Ist einer der Operanden ein Objekt, testet der Interpreter, ob das Objekt<br />
die Methode toString() (zur Umwandlung in eine Zeichenkette) oder<br />
valueOf() (zur Umwandlung in eine Zahl) besitzt. Wenn dies der Fall<br />
ist, wird umgewandelt, ansonsten gibt der Browser eine Fehlermeldung<br />
aus.<br />
Genau gleich (===) und ungleich (!==)<br />
Seit JavaScript 1.3 gibt es die Operatoren genau gleich (===) 3 und ungleich<br />
(!==). Sie überprüfen nicht nur, ob die Werte der zwei Operanden gleich<br />
bzw. ungleich sind, sondern auch, ob die Datentypen identisch sind.<br />
HALT<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
3 Der Operator genau gleich (===) wird auch Identitätsoperator genannt.<br />
81
Programmieren<br />
Mit der Version 3 wurden die beiden Operatoren in den ECMAScript-Standard<br />
übernommen. Die Browserkompatibilität entnehmen Sie Tabelle 3.4.<br />
Ältere Browser unterstützen diese Operatoren nicht.<br />
Tabelle 3.4:<br />
Genau gleich und<br />
genau ungleich<br />
===<br />
!==<br />
NS4.x M/FF IE4 IE5 IE5.5 IE6 IE7 Op SF/KQ<br />
() <br />
HALT<br />
Wenn Sie im Netscape Navigator 4.x als Sprachversion JavaScript 1.2 angeben<br />
(language="JavaScript1.2"), werden die Operatoren genau gleich und<br />
genau ungleich wie der normale Gleichheits- bzw. Ungleichheitsoperator<br />
behandelt. <strong>Das</strong> vermeiden Sie, indem Sie bei der Sprachangabe die Versionsnummer<br />
weglassen.<br />
Ein einfaches Beispiel zeigt dies. <strong>Das</strong> folgende Skript vergleicht eine Zahl<br />
mit einer Zeichenkette:<br />
■ Bei der Verwendung des normalen Gleichheitsoperators == wird die Zeichenkette<br />
automatisch in eine Zahl konvertiert. Der Vergleich bei der<br />
Variablen x ergibt also true.<br />
var a = 4;<br />
var b = "4";<br />
var x = (a == b);<br />
■ Mit dem Operator genau gleich === wird zusätzlich zum Wert auch der<br />
Typ verglichen. Da es sich hier um einen String und eine Zahl handelt,<br />
ist das Ergebnis false.<br />
var y = (a === b);<br />
Hier der vollständige Code:<br />
Listing 3.4:<br />
Der Einsatz von genau gleich (genau_gleich.html)<br />
<br />
<br />
Vergleichsoperatoren<br />
<br />
<br />
<br />
<br />
<br />
82
Operatoren<br />
Abbildung 3.4:<br />
Der Vergleich mit<br />
== liefert true,<br />
=== ergibt false<br />
1<br />
2<br />
Der Genau-ungleich-Operator ist das Gegenstück zu genau gleich. Er liefert<br />
true, wenn zwei Werte ungleich sind und/oder unterschiedliche Datentypen<br />
haben.<br />
var a = 4;<br />
var b = "4";<br />
var x = (a !== b);<br />
ergibt also true, obwohl nicht die Werte, sondern nur der Datentyp ungleich<br />
ist.<br />
3<br />
4<br />
5<br />
Bei einigen Vergleichen von Spezialwerten unterscheiden sich die genauen<br />
und die normalen Vergleichsoperatoren ebenfalls:<br />
■<br />
■<br />
Die Werte null und undefined sind beim Vergleich mit == immer gleich,<br />
beim Vergleich mit === dagegen ungleich.<br />
Beim Vergleich mit == sind 1 und true bzw. 0 und false gleich, beim<br />
Vergleich mit === dagegen nicht.<br />
Vergleich von Strings<br />
Der Vergleich zweier Zeichenketten miteinander ist ein Fall, der bisher noch<br />
nicht aufgetreten ist. Zuerst die gute Nachricht: Der Vergleich ist möglich.<br />
Und nun die schlechte: Da der ASCII-Code des jeweiligen Zeichens die<br />
Grundlage bildet, ist der Vergleich häufig nicht praxistauglich.<br />
Ein einfaches Beispiel macht den Anfang:<br />
var a = "Yesterday";<br />
var b = "Yesterday";<br />
var x = (a == b);<br />
Die Variable x hat nun den Wert true, da die beiden Zeichenketten genau<br />
identisch sind. Beim Vergleich überprüft der JavaScript-Interpreter jedes<br />
Zeichen von links nach rechts. Wenn auch nur ein Zeichen unterschiedlich<br />
ist, ergibt der Vergleich sofort false.<br />
INFO<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
83
Programmieren<br />
Bis jetzt war es noch einfach; bei einem Kleiner-als-Vergleich wird es bereits<br />
schwieriger:<br />
var a = "a";<br />
var b = "b";<br />
var x = (a < b);<br />
Hier wird der ASCII-Code des kleinen a (95) mit dem des kleinen b (96) verglichen.<br />
Da 95 kleiner als 96 ist, ergibt der Vergleich true.<br />
Ein weiteres Beispiel, das die Grenzen dieses Vergleichsverfahrens zeigt:<br />
var a = "a";<br />
var b = "B";<br />
var x = (a < b);<br />
<strong>Das</strong> große B befindet sich wie alle Großbuchstaben in der ASCII-Tabelle vor<br />
den Kleinbuchstaben. Es hat den ASCII-Code 66. Daraus folgt, dass in diesem<br />
Fall der Vergleich false ergibt. <strong>Das</strong> kleine a ist also größer als das große<br />
B.<br />
INFO<br />
Sind zwei Zeichenketten unterschiedlich lang, vergleicht der Interpreter dennoch<br />
von links nach rechts.<br />
var a = "abe";<br />
var b = "Yesterday";<br />
var x = (a < b);<br />
ergibt also false.<br />
Sind die Zeichenketten allerdings bei allen vorhandenen Zeichen identisch,<br />
ist immer die längere Zeichenkette größer.<br />
var a = "Yes";<br />
var b = "Yesterday";<br />
var x = (a < b);<br />
ergibt also true.<br />
Unter http://www.asciitable.com/ finden Sie eine übersichtliche ASCII-<br />
Code-Tabelle.<br />
Eine Alternative zu den Vergleichsoperatoren bietet die Methode<br />
String.localeCompare(). Sie ist neu in JavaScript 1.5 und deswegen nur in<br />
aktuellen Browsern implementiert (siehe Tabelle 3.5).<br />
84
Operatoren<br />
Abbildung 3.5:<br />
Eine übersichtliche<br />
ASCII-Code-Tabelle<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
String.<br />
locale-<br />
Compare()<br />
NS4.x M/FF IE4 IE5 IE5.5 IE6 IE7 Op SF/KQ<br />
<br />
Tabelle 3.5:<br />
String.locale-<br />
Compare()<br />
9<br />
10<br />
Die Funktion hat folgende Syntax:<br />
String1.localeCompare(String2)<br />
Als Ergebnis wird 0 ausgegeben, wenn beide Strings gleich sind, 1, wenn<br />
String1 größer ist und –1, wenn String 2 größer ist. 4 Für den Vergleich wird<br />
der (eingestellte) Zeichensatz des lokalen Betriebssystems verwendet, auf<br />
dem der Browser läuft.<br />
Folgender Beispielcode zeigt die Anwendung von localeCompare() und<br />
ergibt die Bildschirmausgabe x: 1.<br />
11<br />
12<br />
13<br />
4 Der Opera liefert bei Ungleichheit nicht 1 und –1, sondern einen größeren positiven oder negativen<br />
Wert.<br />
85
Programmieren<br />
Listing 3.5:<br />
String-Vergleich mit localeCompare() (string_compare.html)<br />
<br />
<br />
String.localeCompare()<br />
<br />
<br />
<br />
<br />
<br />
Abbildung 3.6:<br />
Beachten Sie, dass<br />
die Ausgabe von<br />
localeCompare()<br />
kein<br />
Wahrheitswert ist .<br />
3.1.4 Logische Operatoren<br />
Mehrere Vergleiche mit Vergleichsoperatoren müssen in irgendeiner Form<br />
miteinander kombiniert werden. Dafür sorgen die logischen Operatoren.<br />
Negation (!)<br />
Die Negation mit dem Ausrufezeichen kehrt einen Wahrheitswert (Boolean)<br />
um. Aus true wird also false und umgekehrt:<br />
var x = !true;<br />
x ergibt also den Wert false.<br />
In der Praxis wird dies häufig bei Bedingungsüberprüfungen eingesetzt. Ein<br />
einfaches Beispiel: Wenn Sie die Funktion isNaN(Wert) einsetzen, erhalten<br />
Sie false, wenn es sich bei dem überprüften Variablenwert (Wert) um eine<br />
Zahl handelt. Soll Ihre Bedingung allerdings true liefern, wenn es sich um<br />
eine Zahl handelt, müssen Sie den Wahrheitswert mit der Negation umdrehen:<br />
var a = "test";<br />
var x = !isNaN(a);<br />
Dieser Code liefert also false.<br />
86
Operatoren<br />
Logisches UND (&&)<br />
<strong>Das</strong> logische UND verknüpft zwei Vergleiche und ergibt nur dann true,<br />
wenn beide Vergleiche true liefern. <strong>Das</strong> zugehörige Symbol wird aus zwei<br />
Et-Zeichen (&, auch Ampersand) gebildet.<br />
Im folgenden Beispiel verknüpft das logische UND die beiden Vergleiche, ob<br />
eine Variable größer 4 und kleiner 6 ist. Der Variablenwert muss also zwischen<br />
4 und 6 liegen, damit die Variable x den Wert true erhält.<br />
Listing 3.6:<br />
Der Einsatz des logischen UND (logisch.html)<br />
<br />
<br />
Logische Operatoren<br />
<br />
<br />
<br />
<br />
<br />
Die Bildschirmausgabe ist<br />
x: true<br />
da die Variable a = 5 zwischen 4 und 6 liegt.<br />
Logisches ODER (||)<br />
<strong>Das</strong> logische ODER liefert im Gegensatz zum logischen UND bereits true,<br />
wenn nur einer der beiden Vergleiche den Wert true, der andere aber den<br />
Wert false hat.<br />
Ein einfaches Beispiel illustriert dies. Die Variable x erhält den Wert true,<br />
obwohl nur der zweite Vergleich true ergibt, der erste dagegen false:<br />
Listing 3.7:<br />
<strong>Das</strong> logische ODER (logisch_oder.html)<br />
<br />
<br />
Logisches ODER<br />
<br />
<br />
<br />
<br />
<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
87
Programmieren<br />
HALT<br />
Beim Einsatz des logischen ODER kann sich der deutsche Sprachgebrauch als<br />
gefährlich erweisen: <strong>Das</strong> logische ODER liefert auch dann true, wenn beide<br />
Vergleiche true liefern. <strong>Das</strong> »Oder« im Deutschen bezeichnet dagegen normalerweise<br />
ein »Entweder … oder ...«.<br />
Short-circuit<br />
Mit dem Begriff Short-circuit wird ein besonderes Verhalten des JavaScript-<br />
Interpreters beschrieben. Wenn der erste Operand beim logischen UND<br />
false ist, ergibt die logische Operation zwangsweise false. In diesem Fall<br />
überprüft der Interpreter den zweiten Operanden – und damit den zweiten<br />
Vergleich – nicht mehr. Dadurch wird Rechenzeit und -performance gespart.<br />
var x = (3 > 4 && 5 > 2);<br />
In diesem Beispiel prüft der Interpreter nicht mehr, ob 5 größer 2 ist, sondern<br />
bricht vorher ab.<br />
Beim logischen ODER steht das Ergebnis true bereits fest, wenn der erste<br />
Operand true ergibt. Auch hier wird der zweite Operand nicht geprüft:<br />
var x = (3 < 4 || 5 < 2);<br />
Dieses Verhalten ist eigentlich sehr sinnvoll, Sie sollten allerdings bedenken,<br />
dass beispielsweise eine Funktion im zweiten Operanden unter<br />
Umständen gar nicht mehr aufgerufen wird.<br />
<strong>Das</strong> Short-circuit-Verhalten des Interpreters ist eine leichte Abweichung von<br />
der normalen booleschen Algebra. <strong>Das</strong> logische UND sowie das logische<br />
ODER entsprechen also nicht ganz der grundlegenden Definition der booleschen<br />
Algebra. In der Praxis ist dieser Unterschied allerdings vernachlässigbar.<br />
HALT<br />
Enthält der erste Operand keinen Vergleich und auch keinen Wahrheitswert,<br />
wird er standardmäßig als true angesehen.<br />
var x = (5 && true);<br />
ergibt also true.<br />
Ist der zweite oder sind beide Operanden keine Wahrheitswerte, wird der<br />
zweite Operand ausgegeben.<br />
Dieses Verhalten ist allerdings nicht – obwohl beobachtbar – festgeschrieben.<br />
Daher sollten Sie sich in der Programmierung nicht darauf verlassen.<br />
Logische Operatoren mischen<br />
Natürlich lassen sich logische Operatoren beliebig miteinander kombinieren.<br />
Zusätzlich mit den Vergleichsoperatoren ergeben sich damit alle Möglichkeiten,<br />
auch für komplexe Überprüfungen.<br />
Eine kleine Quizfrage: Welches Ergebnis liefert der folgende Code?<br />
88
Operatoren<br />
Listing 3.8:<br />
Logische Operatoren mischen (logisch_mischen.html)<br />
<br />
<br />
Logische Operatoren mischen<br />
<br />
<br />
<br />
<br />
<br />
Die lange Zeile mit den logischen Operatoren lässt sich einfach notieren,<br />
wenn wir die Ergebnisse der Vergleiche hineinschreiben:<br />
(!true) || (true && true)<br />
Jetzt wird es klarer: Der erste Vergleich liefert true. Dies wird mit der Negation<br />
umgekehrt. Der eine Operand des logischen ODER-Vergleichs liefert<br />
also false. Der andere muss vom Interpreter noch überprüft werden. Er enthält<br />
ein logisches UND, dessen Operanden beide den Wert true haben. Daraus<br />
folgt, dass das logische UND true zurückgibt; der zweite Operand des<br />
logischen ODER ist also true und damit bleibt auch das Ergebnis, der Wert<br />
der Variablen x, true.<br />
Abbildung 3.7:<br />
Ein Test im Browser<br />
bestätigt das<br />
Ergebnis true.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
3.1.5 Bitweise Operatoren<br />
Die bitweisen Operatoren (auch Bit-Operatoren) dienen dazu, Daten auf Bit-<br />
Ebene zu vergleichen und zu verschieben. Ein Computer speichert alle<br />
Daten in Bits. Ein Bit kann nur zwei Werte, 0 und 1, annehmen. 5<br />
In der Praxis werden die bitweisen Operatoren relativ selten eingesetzt. Sollten<br />
Sie also wenig Zeit oder Interesse an diesem Thema haben, können Sie<br />
den Abschnitt überspringen. Alle Interessierten finden hier zuerst ein klei-<br />
11<br />
12<br />
13<br />
5 Da es sich um zwei mögliche Werte handelt, spricht man auch von Binärwert. Die zugehörige Schreibweise<br />
für Daten ist die Binärschreibweise.<br />
89
Programmieren<br />
nes Beispiel, anschließend eine Tabelle mit allen verfügbaren Operatoren<br />
und zum Schluss eine Umrechnung aus der dezimalen in die binäre Schreibweise.<br />
Die binäre Schreibweise besteht aus einem so genannten Muster. <strong>Das</strong> Muster<br />
hat so viele Stellen, wie die Zahl Bits hat. Eine 4-Bit-Zahl hat also vier<br />
Stellen und kann 2 4 Zahlen darstellen. Die bitweisen Operatoren behandeln<br />
intern alle Zahlen wie 32 Bit-Werte.<br />
0010<br />
<strong>Das</strong> obige Bit-Muster steht für die ganze Zahl 2. Ein Bit-Muster liest sich am<br />
besten von rechts nach links. Die rechte Zahl steht für die 1, die zweite von<br />
rechts für die 2, die dritte für die 4, die vierte für die 8, die fünfte für … raten<br />
Sie! Es geht immer in Zweierpotenzen, also ist die nächste 2 4 = 16. Um die<br />
binäre Schreibweise in die dezimale umzurechnen, müssen Sie also immer<br />
an der Stelle, an der eine 1 steht, die jeweilige Zahl der Stelle addieren:<br />
1010<br />
ergibt also 8 + 0 + 2 + 0 = 10.<br />
Die bitweisen Operatoren wandeln Zahlen intern automatisch in dieses<br />
binäre Muster um und bearbeiten es. <strong>Das</strong> bitweise ODER (|) beispielsweise<br />
erstellt ein neues Muster und schreibt an alle Stellen eine 1, an denen in beiden<br />
Operanden ebenfalls eine 1 vorkommt:<br />
1010 | 0011<br />
ergibt also 1011. Aus den dezimalen Zahlen 10 (1010) und 3 (0011) wird<br />
also 11 (1011). Die übrigen bitweisen Operatoren finden Sie in Tabelle 3.6.<br />
TIPP<br />
Mit parseInt(Binärmuster, 2) können Sie ein Binärmuster sehr einfach in<br />
eine Zahl umwandeln. Um eine Zahl in ein Binärmuster zu verwandeln,<br />
verwenden Sie toString(2):<br />
var a = 15;<br />
alert(a.toString(2));<br />
gibt 1111 aus.<br />
Beachten Sie, dass die direkte Eingabe von Bit-Mustern in JavaScript nicht<br />
möglich ist. Bit-Muster mit beginnender 0 werden vom Interpreter als oktale<br />
Schreibweise interpretiert (siehe Abschnitt 2.1.1 im Abschnitt »Oktale<br />
Schreibweise«). Bit-Muster mit beginnender 1 dagegen liest er als normale<br />
Zahlen. Sie müssen also normale Zahlen nehmen. Der Interpreter wandelt<br />
sie dann intern in die binäre Schreibweise um, führt die Operationen durch<br />
und gibt eine normale Zahl zurück. Tabelle 3.6 verwendet bei den Beispielen<br />
daher nur die Bit-Muster, um die Funktionsweise der Operatoren zu verdeutlichen.<br />
90
Operatoren<br />
Operator Beispiel Beschreibung<br />
&<br />
1010 & 0011 //Erg:<br />
0010 = 2<br />
Bitweises UND; schreibt an die Bits eine 1, an denen in beiden Operanden<br />
eine 1 vorkommt.<br />
Tabelle 3.6:<br />
Die bitweisen<br />
Operatoren<br />
| 1010 | 0011 //Erg:<br />
1011 = 11<br />
^<br />
1010 ^ 0011 //Erg:<br />
1001 = 9<br />
~ ~1010 //Erg: 0101<br />
= 5<br />
1010 >> 2 //Erg:<br />
0010 = 2<br />
>>> 1010 >>> 2 //Erg:<br />
0010 = 2<br />
Bitweises ODER; schreibt an die Stellen eine 1, an denen in einem<br />
oder beiden der Operanden 1 vorkommt.<br />
Bitweises ENTWEDER ODER; stellt an die Bits eine 1, an denen nur in<br />
einem der beiden Operanden 1 vorkommt.<br />
Bitweise Negation; ändert alle Bits des Operanden. Aus 0 wird 1 und<br />
umgekehrt. <strong>Das</strong> Tastenkürzel für das Symbol ist (Alt_Gr)+(+).<br />
Bitweise Verschiebung nach links. Verschiebt das Binärmuster des linken<br />
Operanden um die im rechten Operanden angegebenen Stellen<br />
nach links. Die rechte Seite wird durch Nullen aufgefüllt. Der rechte<br />
Operand sollte maximal 31 betragen, da in JavaScript mit 32 Bit und<br />
damit 32 Stellen gearbeitet wird. Die Verschiebung um eine Stelle entspricht<br />
einer Multiplikation der Zahl mit 2. Zwei Stellen sind dementsprechend<br />
eine Multiplikation mit 4, drei Stellen eine mit 8 usw.<br />
Bitweise Verschiebung nach rechts um die vom rechten Operanden<br />
angegebenen Positionen (maximal 31). Die Bits, die rechts überstehen,<br />
werden gelöscht. Hat der linke Operand ein negatives Vorzeichen,<br />
wird links mit Einsen aufgefüllt, ansonsten mit Nullen. <strong>Das</strong><br />
Verschieben um ein Bit nach rechts entspricht der Division durch 2<br />
(ohne Rest), das um zwei der Division durch 4 usw.<br />
Bitweise Verschiebung nach rechts. Dabei gehen die Bits, die rechts<br />
herausfallen, verloren. Die Bits links werden mit Nullen aufgefüllt.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
Für alle bitweisen Operatoren gibt es wie bei arithmetischen Operatoren die<br />
Kurzform mit integrierter Zuweisung:<br />
x
Programmieren<br />
INFO<br />
Einige Elemente in diesem Beispiel waren noch kein Bestandteil der vorangegangenen<br />
Kapitel, sondern werden später behandelt. Beispielsweise wird der<br />
Umgang mit Formularen detaillierter in Kapitel 20 »Formulare« behandelt.<br />
■ In der Funktion wird zuerst auf die vom Nutzer in das Formularfeld mit<br />
dem Dezimalwert eingegebene Zahl zugegriffen. Sie wird der Variablen<br />
zahl als Wert zugewiesen.<br />
var zahl = formular.dec.value;<br />
■ Anschließend definieren wir 8 Variable für die 8 Bit der binären Zahl.<br />
Sollten Sie mehr als 255 Dezimalwerte umrechnen möchten, müssen Sie<br />
entsprechend mehr Bits verwenden.<br />
var bit8 = 0, bit7 = 0, bit6 = 0, bit5 = 0;<br />
var bit4 = 0, bit3 = 0, bit2 = 0, bit1 = 0;<br />
■ Nun wird für jedes Bit überprüft, ob an dieser Stelle eine 1 im Bit-Muster<br />
vorhanden ist. Dazu dient ein Binärvergleich mit & für jede einzelne<br />
Stelle. Erläutern wir dies beispielhaft für 128: 128 wird in der Binärschreibweise<br />
10000000 geschrieben. Vergleichen wir es mit der vom<br />
Nutzer eingegebenen Zahl, wird beim logischen UND entweder<br />
10000000 zurückgegeben, wenn die eingegebene Zahl im achten Bit eine<br />
1 besitzt, oder der Vergleich liefert 00000000. <strong>Das</strong> letzte Ergebnis entspricht<br />
0 (false) und erfüllt damit die Bedingung der if-Anweisung 7<br />
nicht. Die Variable bit8 wird dann nicht auf 1 gesetzt, sondern bleibt 0.<br />
if (zahl & 128) {<br />
bit8 = 1;<br />
}<br />
■ Sobald der Vergleich für alle Bits durchgeführt ist, schreibt das Skript<br />
das Ergebnis in das Formularfeld für den Binärwert.<br />
formular.bin.value = ("" + bit8 + bit7 + bit6 + bit5 + bit4 + bit3 + bit2<br />
+ bit1);<br />
Im Folgenden finden Sie den vollständigen Code:<br />
Listing 3.9:<br />
Die Umrechnung von dezimaler in binäre Schreibweise (bitweise.html)<br />
<br />
<br />
Bitweise Operatoren<br />
Operatoren<br />
if (zahl & 32) {<br />
bit6 = 1;<br />
}<br />
if (zahl & 16) {<br />
bit5 = 1;<br />
}<br />
if (zahl & 8) {<br />
bit4 = 1;<br />
}<br />
if (zahl & 4) {<br />
bit3 = 1;<br />
}<br />
if (zahl & 2) {<br />
bit2 = 1;<br />
}<br />
if (zahl & 1) {<br />
bit1 = 1;<br />
}<br />
formular.bin.value = ("" + bit8 + bit7 + bit6 + bit5 + bit4 + bit3 +<br />
bit2 + bit1);<br />
}<br />
//--><br />
<br />
<br />
<br />
dezimal (bis<br />
255)<br />
entspricht binär<br />
<br />
<br />
<br />
In Abbildung 3.8 sehen Sie das Ergebnis: eine automatische Umwandlung<br />
von dezimalen in binäre Werte.<br />
Abbildung 3.8:<br />
Der Dezimalwert<br />
wird »live« in<br />
die binäre<br />
Schreibweise<br />
umgewandelt.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
3.1.6 Operator-Präferenz<br />
Bei den arithmetischen Operatoren ist es bereits angeklungen: Operatoren<br />
werden vom JavaScript-Interpreter immer in einer festgesetzten Reihenfolge,<br />
der Operator-Präferenz, abgearbeitet. Für die arithmetischen Operato-<br />
12<br />
13<br />
93
Programmieren<br />
ren entspricht die Reihenfolge der bekannten Punkt-vor-Strich-Regel,<br />
Multiplikation und Division haben also eine höhere Präferenz als Addition<br />
und Subtraktion.<br />
Die Präferenz gibt es allerdings nicht nur für die arithmetischen Operatoren,<br />
sondern für alle Operatoren. In Tabelle 3.1 finden Sie die Operatoren in der<br />
Präferenz-Reihenfolge von hoch (15) bis niedrig (1) aufgeführt.<br />
INFO<br />
Tabelle 3.7:<br />
Präferenz-<br />
Reihenfolge der<br />
Operatoren<br />
(beginnend bei<br />
der höchsten<br />
Präferenz 15)<br />
Einige der Operatoren sind Ihnen noch nicht bekannt. Wir stellen sie in den<br />
folgenden Kapiteln vor.<br />
Präferenz<br />
15 .<br />
[]<br />
()<br />
new<br />
Operator<br />
14 ++<br />
--<br />
- (Vorzeichen)<br />
~<br />
!<br />
delete<br />
typeof<br />
void<br />
13 *<br />
/<br />
%<br />
12 +<br />
-<br />
+ (Konkatenation)<br />
11 ><br />
>>><br />
10 <<br />
<br />
>=<br />
instanceof<br />
9 ==<br />
!=<br />
===<br />
!==<br />
8 &<br />
7 ^<br />
94
Kontrollstrukturen<br />
Präferenz<br />
6 |<br />
5 &&<br />
4 ||<br />
3 ?:<br />
2 =<br />
Kurzformen mit Zuweisung<br />
1 ,<br />
Operator<br />
3.2 Kontrollstrukturen<br />
Tabelle 3.7:<br />
Präferenz-<br />
Reihenfolge der<br />
Operatoren<br />
(beginnend bei<br />
der höchsten<br />
Präferenz 15)<br />
(Forts.)<br />
1<br />
2<br />
3<br />
In der Programmierung ist es essenziell, verschiedene Wahlmöglichkeiten zu<br />
haben. Wie soll das Programm wann handeln? Dies steuern die Kontrollstrukturen,<br />
allen voran die if-Anweisung, die – weil grundlegend – bereits in einigen<br />
Beispielen vorkam.<br />
3.2.1 if-Anweisung<br />
Die if-Anweisung leitet sich direkt aus dem Sprachgebrauch ab. Ein Blick<br />
auf die Syntax verdeutlicht dies:<br />
if (Bedingung) {<br />
Anweisung1;<br />
Anweisung2;<br />
}<br />
Sie lässt sich einfach vorlesen: »Wenn Bedingung eintritt, führe Anweisungen<br />
aus.« Die runden Klammern um die Bedingung und die geschweiften<br />
Klammern um die Anweisungen signalisieren dem Interpreter, wann welcher<br />
Teil beginnt.<br />
Im Sprachgebrauch hat es sich eingebürgert, von der if-Anweisung zu sprechen,<br />
wenn das komplette Konstrukt mit Bedingung und darin enthaltener<br />
Anweisung gemeint ist. Ist dagegen nur von der Anweisung die Rede, bezieht<br />
sich das auf die Anweisungen, die ausgeführt werden, wenn die Bedingung<br />
erfüllt ist.<br />
Die Bedingung enthält meist einen Vergleich mit Vergleichsoperatoren,<br />
eventuell auch in Verbindung mit logischen Operatoren. Die Anweisung<br />
wird nur ausgeführt, wenn die Bedingung true ist. Ansonsten ignoriert der<br />
Interpreter die Anweisung und springt an die Stelle hinter der schließenden<br />
geschweiften Klammer.<br />
INFO<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
95
Programmieren<br />
TIPP<br />
Soll die if-Anweisung ausgeführt werden, wenn die Bedingung false ergibt,<br />
drehen Sie das Ergebnis der Überprüfung einfach mit der logischen Negation<br />
(!) um.<br />
Wie ist das Ergebnis des folgenden Beispiels? Was wird ausgegeben?<br />
var groesse = 180;<br />
if (groesse > 175) {<br />
document.write("Zu groß!");<br />
}<br />
Richtig, der Text »Zu groß!« wird ausgegeben, da die Bedingung der if-<br />
Anweisung erfüllt ist.<br />
Abbildung 3.9:<br />
Der Nutzer ist<br />
bereits zu groß für<br />
die Sandkiste!<br />
<strong>Das</strong> vorhergehende Beispiel lässt sich durchaus weiter ausbauen. Was<br />
geschieht beispielsweise, wenn die Variable groesse einen geringeren Wert<br />
als 175 hat? Um diesen Fall hinzuzufügen, könnten Sie einfach eine weitere<br />
if-Anweisung verwenden:<br />
if (groesse > 175) {<br />
document.write("Zu groß!");<br />
}<br />
if (groesse 175 && groesse < 240) {<br />
document.write("Zu groß!");<br />
}<br />
if (groesse 45) {<br />
document.write("Du passt noch ins Auto.");<br />
}<br />
96
Kontrollstrukturen<br />
Jetzt gibt es allerdings Fälle, die nicht mehr in die Überprüfungen passen,<br />
beispielsweise eine Größe unter 45 oder über 240. Die deckt die else-Anweisung<br />
ab.<br />
else {<br />
document.write("Unrealistisch!");<br />
}<br />
Die else-Anweisung wird immer dann ausgeführt, wenn die vorherigen if-<br />
Anweisungen nicht zutreffen. Sie ist gewissermaßen das Auffangbecken für<br />
alle Fälle, die vorher nicht berücksichtigt werden. Die Syntax sieht wie folgt<br />
aus:<br />
if (Bedingung) {<br />
Anweisung;<br />
} else {<br />
Anweisung;<br />
}<br />
else if<br />
Mehrere if-Anweisungen hintereinander werden immer komplett durchgeprüft.<br />
Trifft die Bedingung jeweils zu, wird die Anweisung ausgeführt. Dieses<br />
Verhalten ist häufig erwünscht, manchmal aber auch unpraktisch.<br />
Ein Beispiel: Sie betreiben eine Website mit Mitgliedern, die unterschiedliche<br />
Berechtigungsstufen von 1 bis 6 haben. Die 6 Berechtigungsstufen<br />
sollen in drei Nutzerklassen eingeteilt werden: Luxusnutzer (5 und 6), Mittelklasse<br />
(3 und 4) sowie Einsteigerpakete (1 und 2), die in der Praxis beispielsweise<br />
auf drei verschiedene Seiten verlinken könnten.<br />
Betrachten Sie die folgende Fallunterscheidung. Erreicht sie das gewünschte<br />
Ziel und trennt die drei Klassen?<br />
var z = 5;<br />
if (z >= 5) {<br />
document.write("Luxusnutzer");<br />
}<br />
if (z >= 3) {<br />
document.write("Mittelklasse");<br />
}<br />
if (z >= 1) {<br />
document.write("Einsteigerpaket");<br />
}<br />
Ein Blick in den Browser zeigt das Problem (siehe Abbildung 3.10). Wenn<br />
die Variable z gleich 5 oder 6 ist, treffen alle drei if-Bedingungen zu und der<br />
Nutzer wird in jede Klasse eingeordnet.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
97
Programmieren<br />
Abbildung 3.10:<br />
Der Nutzer wird<br />
allen drei Kategorien<br />
gleichzeitig<br />
zugeordnet.<br />
Um dieses Problem zu umgehen, verwenden Sie das else if-Konstrukt. Es<br />
hat folgende Syntax:<br />
if (Bedingung) {<br />
Anweisung;<br />
} else if (Bedingung) {<br />
Anweisung;<br />
}<br />
Die else if-Bedingung wird nur geprüft, wenn die if-Bedingung nicht zutrifft.<br />
Im Beispiel ist es ausreichend, die zwei letzten if-Anweisungen durch else<br />
if zu ersetzen:<br />
Listing 3.10: Die else if-Anweisung (else_if.html)<br />
<br />
<br />
else if-Anweisung<br />
<br />
<br />
<br />
<br />
<br />
Abbildung 3.11:<br />
Nun funktioniert<br />
die Unterscheidung<br />
98
Kontrollstrukturen<br />
<strong>Das</strong> hier beschriebene Problem ist natürlich auch auf anderem Wege lösbar.<br />
Beispielsweise ließen sich die Bedingungen der if-Anweisungen so anpassen,<br />
dass es nicht mehr zu Überschneidungen kommt:<br />
if (z == 3 || z == 4) {<br />
else if ist allerdings ein schneller und einfacher Weg.<br />
Ursprünge von else if<br />
In vielen JavaScript-Büchern und Referenzen taucht else if nicht auf. Dies<br />
ist – zumindest unter Gesichtspunkten der vollständigen Sprachabdeckung<br />
– kein Versäumnis, da else if ein Konstrukt ist, das aus if- und else-Anweisungen<br />
gebildet wird.<br />
Die else if-Anweisung besteht aus einer else-Anweisung, bei der einfach die<br />
geschweiften Klammern weggelassen wurden (siehe nächster Abschnitt<br />
»Kurzformen«). Die else-Anweisung erhält als Anweisung ein if. Verständlich<br />
wird dies, wenn man sich die Langform zur else if-Syntax anschaut:<br />
if (Bedingung) {<br />
Anweisung;<br />
} else {<br />
if (Bedingung) {<br />
Anweisung;<br />
}<br />
}<br />
Mehrere else if-Anweisungen hintereinander sind also lediglich ineinander<br />
verschachtelte else- und if-Anweisungen. Unser Beispiel sieht in der Langform<br />
wie folgt aus:<br />
Listing 3.11: Die lange Version von else if (else_if_lang.html)<br />
<br />
<br />
else if-Anweisung<br />
<br />
<br />
Programmieren<br />
//--><br />
<br />
<br />
Achten Sie insbesondere auf die Einrückungen. Funktional gibt es keine<br />
Unterschiede, die else if-Konstruktion ist allerdings wesentlich übersichtlicher<br />
als die Langform.<br />
Kurzformen<br />
Die else if-Konstruktion zeigt bereits eine Kurzform der if-Anweisung. Sie<br />
können die geschweiften Klammern weglassen. Normalerweise allerdings<br />
nur, wenn die Anweisung lediglich aus einer Zeile besteht. Hat sie mehrere<br />
Zeilen, nennt man das auch Anweisungsblock. Ein solcher Block muss in<br />
geschweiften Klammern stehen.<br />
if (a < 3)<br />
document.write(a);<br />
ist also erlaubt.<br />
if (a < 3)<br />
document.write(a);<br />
document.write(++a);<br />
dagegen wirkt sich anders aus. Hier gibt der JavaScript-Interpreter ++a auf<br />
jeden Fall aus, auch wenn a größer 3 ist, da die zweite Anweisung nicht<br />
mehr zur if-Anweisung gehört, obwohl die Einrückung das hier anzudeuten<br />
scheint.<br />
TIPP<br />
Für übersichtlichen Code sollten Sie immer geschweifte Klammern verwenden.<br />
Eine Ausnahme ist natürlich die else if-Konstruktion.<br />
Eine komplette if-Anweisung kann außerdem in nur einer Zeile stehen.<br />
if (a
Kontrollstrukturen<br />
Konditionaler Operator (?)<br />
Der konditionale Operator ist, wie der Name bereits sagt, eigentlich ein Operator.<br />
Er ist sogar noch mehr: der einzige Operator in JavaScript, der drei Operanden<br />
haben kann.<br />
Bedingung ? Wert 1 : Wert 2<br />
Zuerst wird die Bedingung überprüft. Ist sie erfüllt, liefert der Interpreter<br />
den ersten Wert. Ist sie nicht erfüllt, wird der zweite Wert zurückgegeben.<br />
In der Praxis bildet der konditionale Operator oft eine Kurzschreibweise für<br />
eine einfache if-else-Fallunterscheidung. Statt eines Werts wird dann eine<br />
Anweisung eingetragen, die natürlich auch einen Wert zurückliefert.<br />
Im folgenden Beispiel wird überprüft, ob a kleiner 3 ist:<br />
(a < 3) ? document.write("a kleiner 3") : document.write("a größer-gleich<br />
3");<br />
Oder<br />
document.write( (a < 3) ? "a kleiner 3" : "a größer-gleich 3");<br />
Dies entspräche der folgenden if-else-Anweisung:<br />
if (a < 3) {<br />
document.write("a kleiner 3");<br />
} else {<br />
document.write("a größer-gleich 3");<br />
}<br />
3.2.2 switch case<br />
Die Fallunterscheidung mit switch verwendet einen Ausdruck und prüft mit<br />
verschiedenen Fällen, welchen Wert dieser Ausdruck annimmt.<br />
switch (Ausdruck) {<br />
case Wert1:<br />
Anweisung1;<br />
break;<br />
case Wert2:<br />
Anweisung2;<br />
break;<br />
}<br />
Der Ausdruck wird hinter das Schlüsselwort switch in runde Klammern<br />
geschrieben. Meist handelt es sich dabei um eine Variable. Anschließend folgen<br />
die einzelnen Fälle. Jeder Fall beginnt mit dem Schlüsselwort case. Dann<br />
folgt der Wert, den der Ausdruck annehmen muss, damit der Fall eintritt.<br />
Stimmt der Wert mit dem Wert des Ausdrucks überein, wird die Anweisung<br />
ausgeführt. break verlässt die switch-Fallunterscheidung, da nach dem Eintreten<br />
eines Falls nicht weiter geprüft werden muss.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
101
Programmieren<br />
Tritt ein Fall nicht ein, wandert der JavaScript-Interpreter weiter zum nächsten<br />
Fall und überprüft dessen Wert.<br />
TIPP<br />
Die switch-Anweisung gibt es auch in anderen Programmiersprachen wie<br />
Java und C#. Allerdings unterscheidet sich dort häufig die genaue Behandlung.<br />
In Visual Basic heißt die entsprechende Anweisung select case. In PHP<br />
sind in den Fällen auch noch logische Operatoren erlaubt. Dies geht in Java-<br />
Script nicht.<br />
<strong>Das</strong> folgende Beispiel kommt in der Praxis häufiger vor: In JavaScript werden<br />
per Funktion gewonnene Wochentage von 0 (Montag) bis 6 (Sonntag)<br />
zurückgeliefert. Möchten Sie daraus deutsche Begriffe machen, bietet sich<br />
die switch-Anweisung an.<br />
Im folgenden Beispiel verwenden wir nicht das Datumsobjekt von Java-<br />
Script, sondern definieren der Einfachheit halber den Wochentag in einer<br />
Variablen. Wie Sie mit dem Datumsobjekt arbeiten, erfahren Sie in Kapitel 4<br />
»Funktionen«.<br />
<strong>Das</strong> Beispiel besteht aus mehreren Teilen:<br />
■ Zuerst wird der Wochentag in der Variablen tag gespeichert.<br />
■ Diese Variable ist der Ausdruck, der in der switch-Anweisung ausgewertet<br />
wird.<br />
■ Jeder Tag von 0 bis 6 ist ein einzelner Fall. Ihm wird entsprechend die<br />
richtige Ausgabe des deutschen Wochentags zugeordnet.<br />
Hier das vollständige Skript:<br />
Listing 3.12: Die switch-Anweisung (switch.html)<br />
<br />
<br />
switch<br />
<br />
<br />
Kontrollstrukturen<br />
document.write("Freitag");<br />
break;<br />
case 5:<br />
document.write("Samstag");<br />
break;<br />
case 6:<br />
document.write("Sonntag");<br />
break;<br />
}<br />
//--><br />
<br />
<br />
Wenn Sie das Skript testen, wird der richtige Wochentag angezeigt (siehe<br />
Abbildung 3.12).<br />
1<br />
2<br />
3<br />
Abbildung 3.12:<br />
Der richtige<br />
Wochentag wird<br />
ausgegeben.<br />
4<br />
5<br />
6<br />
Wenn Sie break aus Versehen weglassen, werden alle Anweisungen ab dem<br />
zutreffenden Fall ausgeführt. In Abbildung 3.13 ist tag gleich 3, also »Donnerstag«.<br />
Da break fehlt, werden allerdings auch »Freitag« bis »Sonntag«<br />
ausgegeben.<br />
HALT<br />
Abbildung 3.13:<br />
Ohne break<br />
werden alle<br />
Anweisungen ab<br />
der erfüllten<br />
Bedingung<br />
ausgeführt.<br />
7<br />
8<br />
9<br />
10<br />
11<br />
Typkonvertierung<br />
Im Gegensatz zum Einsatz von Vergleichsoperatoren wird in der switchcase-Anweisung<br />
keine automatische Typkonvertierung durchgeführt. Folgender<br />
Code ergibt also keine Ausgabe, da der Wert der Variablen ein String<br />
ist, der zugehörige Fall aber eine Zahl:<br />
12<br />
13<br />
103
Programmieren<br />
var tag = "3";<br />
switch (tag) {<br />
case 0:<br />
document.write("Montag");<br />
break;<br />
case 1:<br />
document.write("Dienstag");<br />
break;<br />
case 2:<br />
document.write("Mittwoch");<br />
break;<br />
case 3:<br />
document.write("Donnerstag");<br />
break;<br />
case 4:<br />
document.write("Freitag");<br />
break;<br />
case 5:<br />
document.write("Samstag");<br />
break;<br />
case 6:<br />
document.write("Sonntag");<br />
break;<br />
}<br />
default<br />
Wenn wie bei der Verwendung eines falschen Datentyps aus dem vorigen<br />
Abschnitt keiner der Fälle eintrifft, ist es oft ärgerlich, dass der Nutzer keine<br />
Rückmeldung erhält. Um dieses Problem zu beheben, fügen Sie einfach am<br />
Ende eine default-Anweisung an. Sie tritt ein, wenn vorher keiner der Fälle<br />
denselben Wert wie der Ausdruck hat.<br />
Die Syntax der switch-Anweisung wird um die default-Anweisung erweitert<br />
und damit ein wenig länger:<br />
switch (Ausdruck) {<br />
case Wert1:<br />
Anweisung1;<br />
break;<br />
case Wert2:<br />
Anweisung2;<br />
break;<br />
default:<br />
Anweisung;<br />
}<br />
Wird das Beispiel mit den Wochentagen um eine default-Anweisung erweitert,<br />
kann damit auch eine Falscheingabe, beispielsweise der Wert 7 für den<br />
Wochentag, abgefangen werden:<br />
104
Kontrollstrukturen<br />
Listing 3.13: Der Einsatz von default (switch_default.html, nicht vollständig abgedruckt)<br />
.<br />
.<br />
.<br />
var tag = 7;<br />
switch (tag) {<br />
case 0:<br />
document.write("Montag");<br />
break;<br />
case 1:<br />
document.write("Dienstag");<br />
break;<br />
case 2:<br />
document.write("Mittwoch");<br />
break;<br />
}<br />
default:<br />
document.write("Keiner der Fälle ist eingetreten");<br />
1<br />
2<br />
3<br />
4<br />
Abbildung 3.14:<br />
Keiner der sieben<br />
Wochentage<br />
konnte identifiziert<br />
werden.<br />
5<br />
6<br />
7<br />
switch und if im Vergleich<br />
Wenn nur mögliche Werte eines Ausdrucks nacheinander ausgewertet werden<br />
sollen, wird eine if-Anweisung unnötig kompliziert. Dies zeigt der<br />
direkte Vergleich zwischen switch und if:<br />
Listing 3.14: <strong>Das</strong> switch-Beispiel, mit if realisiert (if_switch.html)<br />
<br />
<br />
if oder switch<br />
<br />
<br />
Programmieren<br />
document.write("Freitag");<br />
} else if (tag == 5) {<br />
document.write("Samstag");<br />
} else if (tag == 6) {<br />
document.write("Sonntag");<br />
} else {<br />
document.write("Kein gültiger Wochentag!");<br />
}<br />
//--><br />
<br />
<br />
Zwar ist die if-else if-Variante um einige Zeilen 8 kürzer, dafür besteht sie aus<br />
einigen Zeichen weniger und fordert damit auch mehr fehlerträchtige Tipparbeit.<br />
Außerdem wirkt die switch-Variante optisch aufgeräumter. Schließlich<br />
muss jeder selbst abwägen, was ihm besser gefällt. Viele Programmierer greifen<br />
automatisch zu if-else if, da sie dieses Konstrukt besser kennen. Behalten<br />
Sie aber die Alternative switch im Hinterkopf, wenn es an neue Aufgaben<br />
geht.<br />
3.3 Schleifen<br />
Schleifen enthalten stetig sich wiederholende Anweisungen. Sie werden so<br />
lange ausgeführt, bis eine vorher festgelegte Bedingung nicht mehr erfüllt<br />
ist. Fehlt diese Bedingung oder ist sie immer erfüllt, läuft die Schleife ewig.<br />
Man spricht dann von einer Endlosschleife. Endlosschleifen gehören zu den<br />
Fehlern, die es unbedingt zu vermeiden gilt, denn häufig stürzt dem Nutzer<br />
sonst der Browser ab.<br />
TIPP<br />
Haben Sie beim Programmieren eine Endlosschleife erzeugt, klicken Sie im<br />
Browser auf das Stoppsymbol oder betätigen Sie (Esc), um den JavaScript-<br />
Interpreter anzuhalten. Manche Browser fragen im Falle einer Endlosschleife<br />
auch nach, ob sie das Skript abbrechen sollen (siehe Abbildung 3.15).<br />
Abbildung 3.15:<br />
Der Browser<br />
erkundigt sich, ob<br />
das Skript weiter<br />
ausgeführt<br />
werden soll.<br />
3.3.1 for<br />
Die for-Schleife ist die komfortabelste und daher auch meistverbreitete<br />
Schleifenart. Wie oft die Schleife durchlaufen wird, steuern drei Parameter:<br />
8 Um genau zu sein: sieben Zeilen. Natürlich könnten Sie weitere Zeilen einsparen, indem Sie else if-<br />
Anweisungen auf eine Zeile komprimieren. Ähnlich lassen sich auch switch-Fälle in eine Zeile schreiben.<br />
Der Nachteil bei beiden Methoden ist, dass die Übersichtlichkeit sehr stark leidet.<br />
106
Schleifen<br />
for (Initialisierung; Bedingung; Änderung) {<br />
Anweisungen;<br />
}<br />
Die drei Parameter dienen alle zur Steuerung des Schleifenzählers:<br />
■<br />
■<br />
■<br />
Bei der Initialisierung wird typischerweise einer Zählervariablen ein erster<br />
Wert vergeben. Diese Anweisung wird nur einmal, zu Beginn, ausgeführt.<br />
Die Bedingung wird vor jedem Schleifendurchlauf überprüft. Ist sie<br />
erfüllt (true), werden die Anweisungen in der Schleife ausgeführt.<br />
Nach jedem Schleifendurchlauf wird in der Änderung die Zählervariable<br />
angepasst. Dies geschieht so lange, bis die Zählervariable die<br />
Bedingung nicht mehr erfüllt und die Schleife abgebrochen wird. Natürlich<br />
kann die Zählervariable auch in der Schleife geändert werden und<br />
in der Änderung folgen andere Anpassungen.<br />
Jeder der drei Schleifenparameter kann weggelassen werden, nicht aber die<br />
abtrennenden Strichpunkte. Fehlt die Bedingung, ist sie automatisch immer<br />
true. In diesem Fall wird aus der for-Schleife eine Endlosschleife, wenn sie<br />
nicht in den Anweisungen mit break abgebrochen wird.<br />
INFO<br />
1<br />
2<br />
3<br />
4<br />
5<br />
Ein einfaches Beispiel gibt die Quadrate der Zahlen von 1 bis 10 aus:<br />
■<br />
Dazu wird der Zähler auf 1 initialisiert.<br />
for (var i=1;<br />
Die Zählervariable muss nicht unbedingt erst in der for-Schleife deklariert<br />
werden. Meist wird allerdings diese Technik verwendet, da die Zählervariable<br />
nur in der Schleife eingesetzt wird. Hier ist allerdings Vorsicht geboten:<br />
Selbst wenn die Zählervariable erst in der for-Schleife deklariert wird, steht<br />
sie auch nach der Schleife noch zur Verfügung. Sie ist also keine lokale Variable,<br />
wie es sie bei Funktionen gibt (siehe Kapitel 4 »Funktionen«).<br />
■ In der Bedingung überprüft die for-Schleife, ob der Zähler kleiner oder<br />
gleich 10 ist.<br />
for (var i=1; i
Programmieren<br />
<br />
<br />
<br />
Abbildung 3.16:<br />
Die for-Schleife<br />
gibt die Quadrate<br />
der Zahlen von 1<br />
bis 10 aus.<br />
Komma-Operator (,)<br />
Der Komma-Operator ist der Operator mit der niedrigsten Präferenz (siehe<br />
Abschnitt 3.1.6 »Operator-Präferenz«). Er dient dazu, gleichwertige Anweisungen<br />
voneinander zu trennen.<br />
In einer for-Schleife lassen sich für jeden der drei Parameter mehrere, durch<br />
Kommata getrennte, Anweisungen vergeben.<br />
Im folgenden Beispiel nutzen wir dies, um eine zweite Zählervariable t einzusetzen,<br />
die gegenläufig zur ersten von 10 nach unten gezählt wird. Die<br />
beiden Variablen werden in der Anweisung als Produkt i * t ausgegeben:<br />
Listing 3.16: Eine for-Schleife mit mehreren Anweisungen für jeden Parameter (for_komma.html)<br />
<br />
<br />
for-Schleife<br />
<br />
<br />
<br />
<br />
<br />
108
Schleifen<br />
Mit dieser Schleife erzeugen Sie eine symmetrische Zahlenfolge (1*10, 2*9,<br />
3*8 …, siehe Abbildung 3.17).<br />
Abbildung 3.17:<br />
Die Schleife ergibt<br />
eine symmetrische<br />
Zahlenfolge.<br />
1<br />
2<br />
3<br />
4<br />
break<br />
Die break-Anweisung kennen Sie schon von der switch-Fallunterscheidung<br />
(siehe Abschnitt 3.2.2 »switch case«). Sie lässt sich auch dazu verwenden, for-<br />
Schleifen abzubrechen.<br />
Der folgende Code würde die Zahlen von 1 bis 100 untereinander ausgeben.<br />
Im Schleifenkörper ist allerdings eine if-Überprüfung eingebaut. Sie wird<br />
aktiv, wenn die Zählervariable gleich 12 ist, und bricht dann die komplette<br />
Schleife mit break ab:<br />
Listing 3.17: Eine for-Schleife mit break abbrechen (for_break.html)<br />
<br />
<br />
for und break<br />
<br />
<br />
<br />
<br />
<br />
break können Sie auch bei den anderen Schleifentypen wie while- und do<br />
while-Schleifen einsetzen.<br />
TIPP<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
109
Programmieren<br />
Abbildung 3.18:<br />
Bei 12 ist dank<br />
break Schluss,<br />
obwohl der Schleifenzähler<br />
bis 100<br />
reicht.<br />
continue<br />
Der Befehl continue ist das Gegenstück zu break. Er springt zum nächsten<br />
Schleifendurchlauf. Allerdings werden für den aktuellen Durchlauf alle<br />
Anweisungen ignoriert, die nach continue folgen.<br />
<strong>Das</strong> folgende Beispiel nutzt continue, um bei den Zahlen von 1 bis 10 den<br />
Bereich von 4 bis 6 wegzulassen. Mit einer if-Anweisung wird überprüft, ob<br />
die Zählervariable in diesem Durchlauf zwischen 4 und 6 liegt. Ist dies der<br />
Fall, wird der Schleifendurchgang mit continue abgebrochen und gleich der<br />
nächste Durchgang gestartet. Dadurch wird die Ausgabeanweisung für die<br />
Zählervariable übersprungen.<br />
Listing 3.18: continue in einer for-Schleife (for_continue.html)<br />
<br />
<br />
for und continue<br />
<br />
<br />
<br />
<br />
<br />
TIPP<br />
continue funktioniert bei allen Schleifentypen, auch while- und do while-<br />
Schleifen.<br />
110
Schleifen<br />
Abbildung 3.19:<br />
Die Zahlen 4 bis 6<br />
werden ausgespart.<br />
1<br />
2<br />
Verschachtelte Schleifen<br />
Natürlich können Sie Schleifen beliebig ineinander verschachteln. Folgende<br />
Schleifenkombination gibt beispielsweise fünfmal hintereinander die Quadrate<br />
der Zahlen von 1 bis 10 aus:<br />
Listing 3.19: Ausschnitt von verschachtelten for-Schleifen (for_verschachtelt.html)<br />
for (var i=1; i
Programmieren<br />
HALT<br />
Tabelle 3.8:<br />
Schleifen<br />
beschriften<br />
Achten Sie bei einer verschachtelten Schleife darauf, dass die Zählervariable<br />
der inneren Schleife nicht dieselbe sein sollte wie die der äußeren Variablen.<br />
break und continue in verschachtelten Schleifen<br />
Wenn Sie break oder continue in ineinander verschachtelten Schleifen einsetzen,<br />
bezieht sich der Befehl immer auf die Schleife, in der er steht. Häufig<br />
ist es aber gewünscht, die äußere Schleife aus einer inneren Schleife zu<br />
beenden. Für diesen Fall können Sie Schleifen einen Namen geben und den<br />
Namen hinter die break- oder continue-Anweisung schreiben. So erkennt<br />
der Interpreter, welche Schleife er beenden muss:<br />
Name1:<br />
for (Initialisierung; Bedingung; Änderung) {<br />
Anweisungen;<br />
Name2:<br />
for (Initialisierung; Bedingung; Änderung) {<br />
Anweisungen;<br />
break Name1;<br />
}<br />
}<br />
Die Möglichkeit, Schleifen zu beschriften, gibt es in den älteren Browsern<br />
Netscape 2 und 3 und Internet Explorer 3 in den verschiedenen Varianten<br />
nicht. Die aktuellen Browser dagegen unterstützen Schleifen mit Namen.<br />
NS4.x M/FF IE4 IE5 IE5.5 IE6 IE7 Op SF/KQ<br />
<br />
In der Praxis sind beschriftete Schleifen allerdings relativ selten zu finden,<br />
da es nicht so viele Einsatzgebiete für verschachtelte Schleifen gibt bzw.<br />
verschachtelte Schleifen häufig für unübersichtlichen Code sorgen.<br />
Ein kleines Beispiel illustriert die Funktionsweise der Schleifennamen. Wir<br />
beschriften die äußere Schleife mit »schleife1« und die innere mit<br />
»schleife2«. In der if-Anweisung in »schleife2« beenden wir die äußere<br />
Schleife mit break schleife1, sobald die Zählervariable i der äußeren<br />
Schleife den Wert 2 hat. Da dies nach einem Durchlauf der Fall ist, wird<br />
nach der Ausgabe der ersten 100 Zahlen gestoppt:<br />
Listing 3.20: Verschachtelte und beschriftete Schleifen (verschachtelt_beschriften.html)<br />
<br />
<br />
Verschachtelte und beschriftete for-Schleifen<br />
<br />
<br />
Schleifen<br />
schleife2:<br />
for (var j=1; j <br />
<br />
<br />
1<br />
2<br />
Abbildung 3.21:<br />
Die Schleife wird<br />
nur einmal<br />
ausgeführt.<br />
3<br />
4<br />
5<br />
6<br />
7<br />
In JavaScript lassen sich nicht nur Schleifen, sondern auch beliebige andere<br />
Anweisungen beschriften. Bei Schleifen ist der Einsatz von Namen allerdings<br />
am üblichsten und in der Praxis sinnvoll.<br />
for-in<br />
Die for-in-Schleife ist eine Unterart der for-Schleife mit einem ganz<br />
bestimmten Zweck. Sie soll Elemente aus Objekten und Arrays auslesen.<br />
Da sowohl Objekte als auch Arrays in den Kapiteln 6 und 7 ausführlich<br />
behandelt werden, finden Sie hier nur die Syntax und ein kurzes Beispiel zur<br />
for-in-Schleife.<br />
Die Besonderheit der for-in-Schleife ist der in-Operator. 9 Ein Blick auf die<br />
Syntax verdeutlicht die Funktionsweise:<br />
for (Variable in Objekt) {<br />
Anweisung<br />
}<br />
REF<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
9 Es handelt sich hier tatsächlich um einen Operator. Allerdings ist dies keine für die Praxis wichtige<br />
Unterscheidung.<br />
113
Programmieren<br />
Die Variable nimmt bei jedem Schleifendurchlauf eine Eigenschaft des<br />
Objekts auf. Beendet wird die Schleife, wenn alle Eigenschaften eines<br />
Objekts durchlaufen sind.<br />
Anhand eines Arrays wird das verständlicher. Ein Array besteht aus beliebig<br />
vielen Daten, die standardmäßig mit einem ganzzahligen Index versehen<br />
werden, der bei 0 beginnt:<br />
■ Im folgenden Array hat »München« den Index 0, »Frankfurt« den Index 1<br />
und »Berlin« den Index 2.<br />
var a = new Array("München", "Frankfurt", "Berlin");<br />
■ Eine for-in-Schleife liest das Array aus:<br />
for (var index in a) {<br />
In der Variablen index wird die Indexnummer der verschiedenen<br />
Array-Elemente gespeichert. Im ersten Schleifendurchlauf ist das 0, im<br />
zweiten 1, im dritten 2. Ein vierter Durchlauf erfolgt nicht, da das<br />
Array nur drei Elemente hat. Die Schleife wird beendet.<br />
■ Im Schleifenkörper können Sie jetzt mit dem Index arbeiten. Die folgende<br />
Zeile gibt zuerst den Index aus und anschließend das zugehörige<br />
Element (mit dem Array-Namen und dem Index in eckigen Klammern).<br />
document.write(index + ": " + a[index] + "");<br />
Hier das vollständige Skript:<br />
Listing 3.21: for-in (for_in.html)<br />
<br />
<br />
for in<br />
<br />
<br />
<br />
<br />
<br />
Abbildung 3.22:<br />
Der Inhalt des<br />
Arrays wird<br />
ausgegeben.<br />
114
Schleifen<br />
3.3.2 while<br />
Die while-Schleife ist wesentlich einfacher aufgebaut als die for-Schleife.<br />
Einziger Parameter ist die Bedingung, die vor jedem Schleifendurchlauf<br />
überprüft wird. Tritt sie ein, werden die Anweisungen im Schleifenkörper<br />
ausgeführt:<br />
while (Bedingung) {<br />
Anweisungen;<br />
}<br />
Dennoch können Sie, wie der folgende Code beweist, mit while dieselben<br />
Aufgaben wie mit einer for-Schleife bewältigen:<br />
Listing 3.22: Die while-Schleife kann genauso viel wie for (while.html).<br />
<br />
<br />
while<br />
<br />
<br />
<br />
<br />
<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
Abbildung 3.23:<br />
Mit der while-<br />
Schleife lassen sich<br />
dieselben Aufgaben<br />
erledigen wie<br />
mit for.<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
115
Programmieren<br />
Dieser Code gibt die Quadrate der Zahlen von 1 bis 10 aus (siehe analog<br />
Listing 3.15). Gegenüber der for-Schleife muss die Zählervariable allerdings<br />
bereits außerhalb der Schleife definiert und im Schleifenkörper bei jedem<br />
Durchlauf hochgezählt werden. Die Syntax für eine while-Schleife mit Zähler<br />
sieht also wie folgt aus:<br />
Zählerinitialisierung<br />
while (Bedingung) {<br />
Anweisungen;<br />
Zähleränderung<br />
}<br />
Wann ist while sinnvoller?<br />
Welche Schleife Sie zu welchem Zweck einsetzen, ist im Prinzip<br />
Geschmacksache. Erfolgt die Überprüfung der Bedingung nicht direkt in den<br />
Parametern der Schleife, sondern in einer if-Anweisung, wird oft die while-<br />
Schleife bevorzugt.<br />
Folgendes Beispiel arbeitet mit einer while-Schleife, die erst abgebrochen<br />
wird, wenn die if-Bedingung erfüllt und eine durch 21 teilbare Zahl unter<br />
100 gefunden wurde:<br />
Listing 3.23: Ist while manchmal besser als for? (while_besser.html)<br />
<br />
<br />
while besser als for?<br />
<br />
<br />
<br />
<br />
<br />
INFO<br />
Auch dieses Beispiel lässt sich natürlich mit einer for-Schleife realisieren.<br />
Hier ist die while-Schleife ohne die zwei zusätzlichen Parameter jedoch<br />
praktischer, da in einer for-Schleife die Bedingung nicht mit den Zählervariablen<br />
übereinstimmen würde:<br />
for (var zahl = 100; weiter == true; zahl--) {<br />
ist für das Verständnis nicht sehr sinnvoll.<br />
116
Schleifen<br />
Die while-Schleife im letzten Beispiel ließe sich auch noch einfacher gestalten,<br />
indem die Bedingung auf true gesetzt und in der if-Anweisung break<br />
verwendet würde:<br />
while (true) {<br />
if (zahl % 21 == 0) {<br />
document.write(zahl + " ist durch 21 teilbar");<br />
break;<br />
}<br />
zahl--;<br />
}<br />
Dies funktioniert zwar identisch, balanciert allerdings noch näher an der<br />
Endlosschleife, da die Bedingung nie false werden kann.<br />
Abbildung 3.24:<br />
Die erste durch 21<br />
teilbare Zahl<br />
wurde gefunden<br />
und ausgegeben.<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
3.3.3 do while<br />
Die do while-Schleife überprüft die Bedingung erst am Ende:<br />
do {<br />
Anweisungen;<br />
} while (Bedingung)<br />
<strong>Das</strong> heißt auch, dass die Anweisungen im Schleifenkörper mindestens einmal<br />
ausgeführt werden, unabhängig davon, ob die Bedingung am Anfang<br />
erfüllt oder nicht erfüllt ist.<br />
do while gehört noch nicht seit den Anfängen zu JavaScript wie die anderen<br />
Schleifen. Netscape 2 und 3 und Internet Explorer 3 in beiden Varianten<br />
unterstützen sie nicht. Aus heutiger Sicht werden allerdings alle aktuellen<br />
und wichtigen Browser unterstützt.<br />
NS4.x NS6 NS7 IE4 IE5 IE5.5 IE6 O7 M1 K3<br />
<br />
Tabelle 3.9:<br />
do while-Schleife<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
117
Programmieren<br />
Ein Beispiel verdeutlicht die Besonderheit der do while-Schleife:<br />
Listing 3.24: Die do while-Schleife (do_while.html)<br />
<br />
<br />
do while-Schleife<br />
<br />
<br />
<br />
<br />
<br />
Die Bedingung i