18.10.2014 Aufrufe

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

MEHR ANZEIGEN
WENIGER ANZEIGEN

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&auml;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&szlig;!");<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&szlig;!");<br />

}<br />

if (groesse 175 && groesse < 240) {<br />

document.write("Zu gro&szlig;!");<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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!