vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbacknächstes Kapitel


Woche 2

Tag 9

Schlüsselworte, Operatoren und Wertzuweisungen

Am Tag 9 werden wir uns weiter mit Syntaxgrundlagen von JavaScript beschäftigen. Nachdem wir gestern

besprochen haben, soll heute auf die diese Themen erweiternden Punkte

eingegangen werden.

JavaScript-Schlüsselworte

Jede Programmier- und Script-Sprache besitzt bestimmte Worte, die ein essentieller Teil der Sprachdefinition sind. Das sind Worte, die bereits eine feste Bedeutung haben. Etwa unter JavaScript den Begriff var, welcher bei der Variablendeklaration verwendet wird. Oder function zur Einleitung einer Funktionsdeklaration. Wenn solche Worte als Bezeichner für Variablen oder Funktionen verwendet werden, kann der Interpreter nicht zwischen dem Bezeichner und dem Schlüsselwort unterscheiden. Wenn also eines der reservierten Schlüsselworte als Bezeichner verwendet wird, führt dies beim ersten Laden des Scripts zu einem Fehler im Interpreter. Testen wir das einfach mal.

Beispiel 1

Geben Sie folgenden Quelltext ein:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
var function=8;
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

Speichern Sie das Script unter schluesselwortFehler.htm und laden Sie es in einen Browser.

Abbildung 9.1:  So was geht nicht

JavaScript hat sowohl aktuell benutzte Schlüsselworte reserviert, aber auch bestimmte Token für zukünftige Sprachvarianten, um potentielle Inkompatibilitäten für die Zukunft zu vermeiden.

Unter einem Token kann man einen Sinnzusammenhang verstehen, der aus im Quelltext vorkommenden Zeichen gebildet wird, wenn der Quelltext in ausführbare Befehle übersetzt werden soll. In der Situation muss zunächst geklärt werden, welche einzelnen Zeichen und Symbole oder zusammengeschriebene Zeichen- und Symbolgruppen im Code welche Bedeutung haben. Wenn der Quellcode vom interpretierenden System analysiert wird, wird er von dem System dabei in einzelne kleine Bestandteile (Token) zerlegt. Ein Token ist dabei entweder ein bestimmtes einzelnes Zeichen/Symbol oder meistens ein aus mehreren Zeichen zusammengesetzter Begriff. Das interpretierende System versteht ein gültiges Zeichen oder die Sammlung von Zeichen. Erkennt das System das spezifische Zeichen oder die Ansammlung von Zeichen, wird daraus ein Sinnzusammenhang, dem eine bestimmte Aktion durch das System folgt. Sonst bleibt das spezifische Zeichen oder die Ansammlung von Zeichen einfach nur die Summe der Buchstaben oder Zeichen. Die Sprachelemente werden von vielen Systemen bei der Zerlegung in Token bereits auf ihre Richtigkeit geprüft.

Tabelle der JavaScript-Schlüsselworte

Schlüsselwort

Beschreibung

abstract

reserviert

boolean

reserviert

break

Abbruch in Schleifen

byte

reserviert

case

Fallunterscheidungen

catch

reserviert

char

reserviert

class

reserviert

const

reserviert

continue

Fortsetzung in Schleifen

debugger

reserviert

default

Fallunterscheidungen

delete

Löschen eines Array-Elements oder einer selbstdefinierten Objekteigenschaft

do

Beginn einer Erweiterung der while-Schleife (do-while)

double

reserviert

else

Einleitung des alternativen Blocks in einer if-Schleife

enum

reserviert

export

Objekte oder Funktionen für fremde Scripts ausführbar machen

extends

reserviert

false

der Wert »falsch«

final

reserviert

finally

reserviert

float

reserviert

for

Einleitung von for-Schleifen

function

Einleitung von Funktionen

goto

reserviert

if

Einleitung von if-Schleifen

implements

reserviert

import

Objekte oder Funktionen eines fremden Scripts importieren

in

bedingte Anweisungen in if-Schleifen

instanceof

reserviert

int

reserviert

interface

reserviert

long

reserviert

native

reserviert

new

Definition von Objekten

null

reserviert

package

reserviert

private

reserviert

protected

reserviert

public

reserviert

return

Übergabe eines Rückgabewertes in Funktionen

short

reserviert

static

reserviert

super

reserviert

switch

Fallunterscheidung

synchronized

reserviert

this

Bezug auf die aktuelle Instanz eines Objekts

throw

reserviert

throws

reserviert

transient

reserviert

true

der Wert »wahr«

try

reserviert

typeof

Typ eines Elements

var

Definition einer Variablen

void

leerer Funktionstyp

volatile

reserviert

while

Einleitung einer while-Schleife

with

erlaubt, mehrere Anweisungen mit einem Objekt durchzuführen

Tabelle 9.1: JavaScript-Schlüsselworte (JavaScript 1.3)

Wir werden im Laufe des Buches die meisten der hier aufgelisteten und derzeit in Verwendung befindlichen Schlüsselworte in der Praxis sehen.

Operatoren und Operanden

Ein wichtiger Begriff in der Programmierung ist Ausdruck. Einziges wichtiges Kennzeichen eines Ausdrucks ist, dass er einen Wert besitzt. Im einfachsten Fall besteht ein Ausdruck nur aus einem Literal oder einer Variablen. In diesem trivialen Fall ist der Wert des Ausdrucks identisch mit dem Literal oder dem Wert der Variablen. Es gibt aber auch zusammengesetzte Ausdrücke. In diesem Fall werden Literale und/oder Variablen miteinander verknüpft. Der Wert des Ausdrucks ist dann das Ergebnis der Verknüpfung. Die Verknüpfung selbst erfolgt über so genannte Operatoren. Operatoren sind besondere Zeichen oder Zeichenkombinationen, die eine auszuführende Handlung mit einer oder mehreren Variablen oder konstanten Werten ausführen. Diese werden dabei Operanden genannt.

JavaScript kennt drei Formen von Operatoren:

In der Regel werden Operatoren in mehrere Kategorien eingeteilt.

Arithmetische Operatoren

Arithmetische Operatoren benutzen zwei nummerische Operanden (Zahlen oder Variablen mit nummerischem Inhalt) und verbinden diese so, dass daraus ein neuer Wert wird. Es gibt in JavaScript folgende arithmetischen Operatoren (die wir schon aus Beispielen kennen):

Operator

Beschreibung

+

Additionsoperator

-

Subtraktionsoperator

*

Multiplikationsoperator

/

Divisionsoperator

%

Modulo-Operator

Tabelle 9.2: Arithmetische Operatoren

Testen wir diese Operatoren in einem Beispiel. Dabei wird insbesondere der Modulo-Operator von Interesse sein. Er gibt den Rest einer Division zurück und zählt bei vielen anspruchsvolleren Techniken (Verschlüsselungsverfahren, Grafikberechnungen, technischen Scripten) zu den dringend notwendigen Hilfsmitteln.

Beispiel 2:

Erstellen Sie die Datei ArithOp.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
document.write("1 + 3 = ", 1+3);
document.write("<BR>");
document.write("2 * 3 = ", 2*3);
document.write("<BR>");
document.write("5 / 3 = ", 5/3);
document.write("<BR>");
document.write("3 - 1 = ", 3-1);
document.write("<BR>");
document.write("10 % 3 = ", 10%3);
document.write("<BR>");
document.write("10 % 4 = ", 10%4);
document.write("<BR>");
document.write("11 % 4 = ", 11%4);
document.write("<BR>");
document.write("12 % 3 = ", 12%3);
document.write("<BR>");
document.write("19 % 7 = ", 19%7);
document.write("<BR>");
document.write("5 % 3 = ", 5%3);
document.write("<HR>");
document.write("Beachten Sie, was 5 / 0 gibt: ", 5/0);
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

Abbildung 9.2:  Verschiedene arithmetische Operationen

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

Einstellige arithmetische Operatoren sind Spezialfälle der gerade genannten arithmetische Operatoren. Es gibt davon zwei. Sie verwenden nur einem Operanden, der dem Operator nachgestellt wird:

Operator

Beschreibung

-

Einstellige arithmetische Negierung, welche die arithmetische Vorzeichenumdrehung ihres nachfolgenden nummerischen Operanden ergibt.

+

Der einstellige Operator + ist nur aus Symmetriegründen vorhanden.

Tabelle 9.3: Einstellige arithmetische Operatoren

Zuweisungsoperatoren und Wertzuweisung

Zuweisungsoperatoren sind die Grundlage jeder Wertzuweisung. Sie weisen das Ergebnis einer auf der rechten Seite stehenden Operation (damit ist auch die einfache Notation eines konstanten Werts gemeint) der linken Seite des Ausdrucks zu. In unseren bisherigen Wertzuweisungen haben wir immer den direkten Zuweisungsoperator = verwendet.

Bevor wir neue Zuweisungsoperatoren kennen lernen, wollen wir eine Wertzuweisung besprechen, die Einsteigern immer wieder Kopfzerbrechen bereitet. Was bedeutet die folgende Zeile, wenn a eine Variable ist?

a = a + 1;

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

1 = 2;
2 = 3;
41 = 42;
2000 = 2001;

usw. bedeuten. Selbst ich als Mathematiker könnte Ihnen das wohl schwer verkaufen ;-). Nur - diese Zeile darf so nicht gelesen werden. Es handelt sich um eine Wertzuweisung, die in zwei aufeinander folgende, logische Schritte zerlegt werden muss. Teilen wir die Zeile

a = a + 1;

in zwei Zeilen mit zwei Variablen auf:

b = a + 1;
a = b;

Diese beiden Zeilen sind so zu lesen:

Erster Schritt: Weise der Variablen b den Wert a + 1 zu.

Zweiter Schritt: Weise der Variablen a den Wert b zu.

Was hat a danach für einen Wert? Eins mehr als vorher. Wenn nun in der zweiten Zeile b durch das ersetzt wird, was b zu dem Zeitpunkt für einen Wert hat (a + 1), steht da genau unsere mathematisch unsinnige Zeile.

Man muss also die Zeile

a = a + 1;

so lesen: Zuerst wird die rechte Seite berechnet und dann der Variablen auf der linken Seite zugewiesen. Wie die Variable auf der linken Seite konkret heißt, spielt keine Rolle. Sie bekommt nach der Auswertung der rechten Seite einfach einen neuen Wert zugewiesen.

Die Möglichkeit einer solchen Selbstzuweisung ist der vielleicht wichtigste Baustein für eine effektive Programmierung. Sie werden so etwas an unzähligen Stellen finden (gerade in Schleifen). Dabei kann diese Technik in Verbindung mit sämtlichen arithmetischen Operatoren und natürlich auch Zahlen ungleich eins verwendet werden. In der hier besprochenen Form oder über die nachfolgend noch besprochenen Wege.

Testen wir diese Geschichte mit einem Beispiel:

Beispiel 3:

Erstellen Sie die Datei Selbst.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
var a=0;
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
a = a + 1;
document.write(a);
document.write("<BR>");
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

Abbildung 9.3:  Immer eins mehr

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

Operator

Beschreibung

+=

Additions-Zuweisungsoperator

-=

Subtraktions-Zuweisungsoperator

*=

Multiplikations-Zuweisungsoperator

/=

Divisions-Zuweisungsoperator

%=

Modulo-Zuweisungsoperator

Tabelle 9.4: Arithmetische Zuweisungsoperatoren

Das ist dann folgendermaßen zu verstehen:

a += 2; entspricht a = a + 2;

und

a *= 5; entspricht a = a * 5;

Beispiel 4:

Erstellen Sie die Datei ArithZuOp.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
var a=4;
document.write(a);
document.write("<BR>");
a +=1;
document.write(a);
document.write("<BR>");
a -=2;
document.write(a);
document.write("<BR>");
a *=3;
document.write(a);
document.write("<BR>");
a /=2;
document.write(a);
document.write("<BR>");
a %=4;
document.write(a);
document.write("<BR>");
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

Abbildung 9.4:  Verschiedene  arithmetische  Zuweisungsaktionen

Inkrement-/Dekrement-Operatoren

In engem Bezug zu Wertzuweisungen stehen die so genannten Inkrement-/ Dekrement-Operatoren. Diese werden zum Auf- und Abwerten eines einzelnen Wertes verwendet. Inkrement- und Dekrement-Operatoren sind einstellige Operatoren und werden nur in Verbindung mit einem ganzzahligen oder einem Fließkomma-Operanden benutzt.

Der Inkrement-Operator ++ erhöht den Wert des Operanden um 1. Die Syntax

++zaehler;

entspricht

zaehler = zaehler + 1;

oder auch

zaehler+=1;

Es bedeutet also, dass der Wert der nachstehenden Variablen um eins erhöht und dann der Variablen wieder zugewiesen wird.

Es gibt aber auch die Syntax, wo der Operator der Variablen nachgestellt wird. Die Reihenfolge von Operand und Operator ist relevant. Wenn der Operator vor dem Operanden steht, erfolgt die Erhöhung des Wertes, bevor der Wert dem Operanden zugewiesen wird. Wenn er hinter dem Operanden steht, erfolgt die Erhöhung, nachdem der Wert bereits zugewiesen wurde. Wir testen dies mit einem Beispiel:

Beispiel 5:

Erstellen Sie die Datei Dekrement.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
var a=4;
document.write(a);
document.write("<BR>");
document.write(a++);
document.write("<BR>");
document.write(a);
document.write("<BR>");
document.write(++a);
document.write("<BR>");
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

Abbildung 9.5:  Optisch unscheinbar,  aber alles Notwendige  ist sichtbar

Das Beispiel nimmt eine Variable, weist einen Wert zu und gibt ihn aus. Die Zeile

document.write(a++);

erhöht zwar den Wert der Variablen, aber erst, nachdem (!) die Ausgabe erfolgt ist. Das bedeutet, der Wert wird erst erhöht, nachdem der Wert bereits zugewiesen wurde. Die nachfolgende Ausgabe beweist die Erhöhung, denn es wurde keine weitere Veränderung der Variablen vorgenommen. Die Zeile

document.write(++a);

zeigt, dass das Voranstellen des Operators den Wert vor der Ausgabe erhöht. Der Wert wurde also erhöht und dann erst zugewiesen.

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

Der Dekrementoperator ist die kritische Zeichenkombination, welche im Netscape Navigator in einigen Versionen Konflikte mit dem Ende des HTML-Kommentars auslöst. Der Netscape Navigator verwechselt das Ende des HTML-Kommentars beim Einschluss von Scripten in HTML-Kommentare mit diesem Operator. Für den Navigator muss das Ende-Zeichen des HTML-Kommentars vor dem Script-Interpreter mit JavaScript-Kommentarzeichen versteckt werden. Die Anweisung vor dem Ende des <SCRIPT>-Containers sieht deshalb zur Sicherheit so aus:

//-->

Das recht diffizile Verhalten des Operators macht den Umgang damit nicht ganz ungefährlich. Hauptanwendung finden die beiden Operatoren in Kontrollstrukturen und Schleifen. Dort werden die Operatoren meist so eingesetzt, dass das unterschiedliche Verhalten bei Voran- und Nachstellen keine Rolle spielt.

Vergleichsoperatoren

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

Operator

Beschreibung

==

Gleichheitsoperator

!=

Ungleichheitsoperator

<

Kleiner-als-Operator

>

Größer-als-Operator

<=

Kleiner-als-oder-gleich-Operator

>=

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

Tabelle 9.5: Vergleichsoperatoren

Die Operatoren werden in Verbindung mit Kontrollflussanweisungen verwendet. Wir kennen beispielsweise die if-Anweisung und wollen diese in einem Beispiel einsetzen.

Beispiel 6:

Erstellen Sie die Datei vergleichsop.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
function test()
{
var a=4;
if (a>4)
{
document.write(a);
document.write("<BR>");
}
else
{
document.write("Zu klein");
document.write("<BR>");
}
if (a>=4)
{
document.write("Ok");
document.write("<BR>");
}
else
{
document.write("Zu klein");
document.write("<BR>");
}
if (a<=4)
{
document.write("Ok");
document.write("<BR>");
}
else
{
document.write("Zu klein");
document.write("<BR>");
}
if (a<4)
{
document.write("Ok");
document.write("<BR>");
}
else
{
document.write("Zu gross");
document.write("<BR>");
}
if (a==4)
{
document.write("Ok");
document.write("<BR>");
}
else
{
document.write("Zu klein");
document.write("<BR>");
}
if (a!=4)
{
document.write("Ok");
document.write("<BR>");
}
else
{
document.write("Nit fier");
document.write("<BR>");
}
}
</SCRIPT>
</HEAD>
<BODY onLoad="test()">
</BODY>
</HTML>

Abbildung 9.6:  Die Ergebnisse der Vergleiche

Das Beispiel ist recht einfach zu lesen und die Ausgabe demonstriert die Wirkung der Vergleichsoperatoren.

Beachten Sie, dass der Gleichheitsoperator == nicht mit dem Zuweisungsoperator = identisch ist. Es ist ein oft gemachter Fehler, bei einem Vergleich den Zuweisungsoperator zu notieren. Einige Sprachen wie Visual Basic oder VBScript verwenden deshalb nur das einfache Gleichheitszeichen für beide Konstellationen. Eine Vereinfachung, die wie jedwede Schwächung von strengen Syntaxregeln ihren Preis hat. Es kann dadurch zu ungewollten Wertzuweisungen kommen, wo eigentlich nur ein Vergleich geplant ist. Wer mit beiden Varianten ausreichend Programmiererfahrung hat, wird den Einsatz von unterschiedlichen Operatoren trotz der Probleme mit dem Verwechseln als die bessere Lösung schätzen.

Logische Vergleichsoperatoren

Die logischen Vergleichsoperatoren werden nur auf boolsche (Wahrheits-) Operanden angewandt und erzeugen auch nur boolsche Ergebnisse. Das bedeutet, es kann entweder true oder false als Wert erzeugt werden. JavaScript kennt folgende logische Vergleichsoperatoren:

Operator

Beschreibung

&&

logischer AND-Operator

||

logischer OR-Operator

!

logischer NOT-Operator

Tabelle 9.6: Logische Vergleichsoperatoren

Einsatz finden solche Operatoren beispielsweise bei der Verknüpfung von verschiedenen Bedingungen (der NOT-Operator wird aber auch einzeln verwendet), welche in einer Kontrollstruktur gemeinsam bewertet werden müssen. Etwa in der if-Schleife, die wir schon mehrfach verwendet haben.

Beispiel 7:

Erstellen Sie die Datei LogVerglOp.htm. Die entscheidenden Stellen sind so eingerückt, dass die Abhängigkeiten gekennzeichnet werden:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
function schreibeAntwort(sum,anz)
{
document.write("<H1 align=center>Provision</H1>");
document.write("<P align=left>");
if(
  (sum > 100000)
    &&
  (anz > 3)
)
{
document.write("Schöne Einzelleistung. Sie erhalten 5% Provision");
document.write("<BR>Das sind DM " + (sum * 0.05));
document.write("<BR>");
}
if(
  (sum <= 100000)
    ||
  (anz < 4)
)
{
document.write("Das ist nicht befriedigend. Sie erhalten nur 2% Provision");
document.write("<BR>Das sind DM " + (sum * 0.02));
document.write("<BR>");
}

}
function weiter()
{
vsum=document.forms[0].elements[0].value;
vanz=document.forms[0].elements[1].value;
schreibeAntwort(vsum,vanz);
}
</SCRIPT>
</HEAD>
<BODY>
<H1 align=center>Umsatzzahlen Versicherungen</H1>
<H3 align=center>Eingabe der abgeschlossenen Versicherungssumme</H3>
<H3 align=center>und</H3>
<H3 align=center>der Anzahl der Verträge</H3>

<FORM>
Versicherungssumme <INPUT>
<BR>
Anzahl der Verträge <INPUT>
<BR>
<INPUT type="Button" value="Weiter" onClick="weiter()">
</FORM>
</BODY>
</HTML>

Das Beispiel generiert wieder ein Formular (wie wir am Tag 8 bereits vorgeführt haben). Die Funktionalität soll folgende sein: Ein Versicherungsvertreter gibt in dem Formular ein, wie viele Verträge er abgeschlossen hat und über welche Gesamtversicherungssumme.

Abbildung 9.7:  Die Eingaben mit beiden Bedingungen erfüllt

Nach der Bestätigung der Eingaben durch Klick auf die Schaltfläche wird eine neue Seite geschrieben. Dort werden die logischen Vergleichsoperatoren verwendet. Betrachten wir die entsprechenden Zeilen. Die if-Anweisung

if(
  (sum > 100000)
    &&
  (anz > 3)
)

kontrolliert, ob sowohl die Versicherungssumme größer als 100000 ist als auch die Anzahl der Verträge größer als 3. Nur wenn beide Bedingungen erfüllt sind, wird der nachfolgende Block ausgeführt.

Abbildung 9.8:  Das Resultat

Beachten Sie, dass die Summe und die Anzahl der Verträge als Übergabeparameter an die Funktion übergeben werden. Dabei wird bewusst beim Aufruf jeweils ein anderer Name für die Variable gewählt als für die lokal in der Funktion benutzte Variable. Erinnern Sie sich - die Namen könnten gleich sein, müssen es aber nicht. Es sind ja lokal definierte Variablen.

Abbildung 9.9:  Die Eingaben einer Bedingung nicht erfüllt

Wenn nun eine der beiden Bedingungen nicht erfüllt ist, wird der erste if- Block nicht ausgeführt. Normalerweise lässt man nun einen else-Block folgen. Das ist hier bewusst nicht geschehen (wir wollen ja einen weiteren logischen Vergleichsoperator testen), sondern ein weiterer if-Block fängt diese Situation ab (er ist logisch so konzipiert, dass genau der else-Fall simuliert wird). Die if-Anweisung

if(
  (sum <= 100000)
    ||
  (anz < 4)
)

kontrolliert, ob eine der beiden Bedingungen nicht erfüllt ist. Dabei wurde einmal auf kleinergleich und einmal auf kleiner geprüft. Der nachfolgende Block wird ausgeführt, wenn eine oder beide Bedingungen erfüllt ist/sind.

Abbildung 9.10:  Das Resultat

Spielen wir noch ein Beispiel mit dem logischen Nicht-Operator durch.

Beispiel 8:

Erstellen Sie die Datei LogNot.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
function lade()
{
var a = false
if(!a)
{
document.write("Nicht")
document.write("<BR>")
}
}
</SCRIPT>
</HEAD>
<BODY onLoad="lade()">
</BODY>
</HTML>

Abbildung 9.11:  Das sagt alles

Das Beispiel ist aus mehreren Gründen trotz der unscheinbaren Ausgabe sehr interessant. Es wird z.B. eine boolsche Variable verwendet. Also eine Variable, die nur true und false annehmen kann. In Kontrollstrukturen sind solche boolschen Werte von elementarer Bedeutung. Es geht nämlich immer nur darum, ob eine Prüfung wahr oder falsch ist. Man kann deshalb dort auch Variablen notieren, welche den Wert true oder false besitzen. Ganz ohne irgendwelche Vergleiche (die können vorher durchgeführt worden sein oder aber es wurde - wie in unseren Fall - der Variablen einfach ein boolscher Wert zugewiesen). Da die Variable a den Wert false hat, dürfte der nachfolgende Block in der if-Schleife nicht ausgeführt werden. Der vorangestellte Operator ! dreht den Wert jedoch auf true um.

Der konditionale und der typeof-Operator

Unter dem konditionalen bzw. if-else-Operator versteht man die Kombination aus Fragezeichen und Doppelpunkt ? :. Der Doppeloperator arbeitet mit drei Operanden. Die Operation benötigt einen boolschen Ausdruck vor dem Fragezeichen. Wenn er »wahr« liefert, wird der Wert vor dem Doppelpunkt zurückgegeben, ansonsten der Wert hinter dem Doppelpunkt. Der Operator ist eine Kurzschreibweise für ein if-else- Konstrukt. Wir wollen darauf bei der intensiveren Behandlung der if- Schleife zurückkommen.

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

als Ergebnis angegeben werden.

Beispiel 9:

Erstellen Sie die Datei typeof.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
function lade()
{
var a = 2;
var b = true;
var c = new Date();
var d;
var e = "Das ist Text";
document.write(typeof a)
document.write("<BR>")
document.write(typeof b)
document.write("<BR>")
document.write(typeof c)
document.write("<BR>")
document.write(typeof d)
document.write("<BR>")
document.write(typeof e)
document.write("<BR>")
}
</SCRIPT>
</HEAD>
<BODY onLoad="lade()">
</BODY>
</HTML>

Abbildung 9.12:  Typ der Variablen

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

Bitweise Operatoren

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

Auch JavaScript stellt diese Operatoren zur Verfügung:

Operator

Beschreibung

&

bitweiser AND-Operator

|

bitweiser OR-Operator

^

bitweiser XOR-Operator

~

bitweiser Komplement-Operator

<<

bitweise Verschiebung nach links

>>

bitweise Verschiebung nach rechts

>>>

bitweise Verschiebung nach rechts mit Füllnullen

Tabelle 9.7: Bitweise Operatoren

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

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

Bitweise Vergleichsoperatoren vergleichen binär zwei Operanden.

Operator

Beschreibung

&=

bitweise AND-Zuweisung

|=

bitweise OR-Zuweisung

^=

bitweise XOR-Zuweisung

<<=

bitweise Verschiebungszuweisung nach links

>>=

bitweise Verschiebungszuweisung nach rechts

>>>=

bitweise Verschiebungszuweisung nach rechts mit Füllnullen

Tabelle 9.8: Bitweise Vergleichsoperatoren

Operatoren-Prioritäten

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

Priorität

Operatoren

1

() []

2

! ~ -1 ++ -- typeof

3

* / %

4

+ -2

5

<< >> >>>

6

< <= > >=

7

== !=

8

&

9

^

10

|

11

&&

12

||

13

?:

14

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

15

,

Tabelle 9.9: Prioritäten der Operatoren

1

    Im Sinn von Negation

2

    Im Sinn von Subtraktion

Beispiel 10:

Erstellen Sie die Datei Priori.htm:

<HTML>
<HEAD>
<SCRIPT language="JavaScript">
function lade()
{
var a;
a = 1 + 2 * 3;
document.write(a);
document.write("<BR>");
a = (1 + 2) * 3;
document.write(a);
document.write("<BR>");
}
</SCRIPT>
</HEAD>
<BODY onLoad="lade()">
</BODY>
</HTML>

Abbildung 9.13:  Ohne und mit Klammern

Das Beispiel nutzt bei der ersten Berechnung Punkt-vor-Strich-Rechnung aus, die durch die unterschiedlichen Prioritäten der Operatoren realisiert ist. Die zweite Berechnung hebt sie durch Klammern auf, da Klammern die höchste Priorität haben.

Zusammenfassung

Am heutigen Tag stand ein wohl etwas trockenes, aber nichtsdestotrotz sehr wichtiges Thema auf dem Stundenplan. Operatoren und Wertzuweisungen gehören zu den Grundtechniken, die jeder Programmierer aus dem FF beherrschen sollte. Insbesondere sollte klar geworden sein, dass Wertzuweisungen auf verschiedene Arten möglich sind. Wenn einer Variablen über einen Zuweisungsoperator ein Ausdruck zugewiesen wird, wird der Ausdruck auf der rechten Seite immer zuerst vollständig bewertet, bevor das Ergebnis zugewiesen wird.

Fragen und Antworten

Frage:
Wenn ich alle Schlüsselworte von JavaScript kenne, kann ich dann die Sprache?

Antwort:
Gegenfrage: Wenn Sie alle Worte der - sagen wir mal - spanischen Sprache kennen, können Sie dann Spanisch? Ohne die Grammatik nutzt die Kenntnis der Worte wenig. Und ohne Erfahrung und Praxis, wie man die Worte sinnvoll miteinander verbindet, nutzt auch die Kenntnis der Grammatik noch nicht viel. Es ist eher umgekehrt zu sehen. Die Kenntnis der (wichtigsten) Worte ist notwendig, aber noch lange nicht hinreichend.

Frage:
JavaScript hat eine ganze Reihe von Operatoren. Ist das nun viel oder wenig im Verhältnis zu anderen Sprachen?

Antwort:
Guter Durchschnitt. Es gibt Sprachen, die nicht so viele Operatoren bereitstellen, aber auch Sprachen wie Perl, die noch mehr Operatoren besitzen.

Frage:
Wenn ich die JavaScript-Operatoren von der Bedeutung her kenne, kenne ich dann auch die gleichen Operatoren in anderen Sprachen?

Antwort:
Ja, bis auf wenige Ausnahmen sind Operatoren in den meisten Programmier- und Scriptsprachen gleich. Eine der wichtigsten Ausnahmen ist der Vergleichsoperator, der in einigen Sprachen nur mit einem Gleichheitszeichen realisiert wird.

Workshop

Testen Sie verschiedene Schlüsselworte als Bezeichner. Der Interpreter wird keinen einzigen Fall durchlassen. Schauen Sie sich nochmals Beispiel 7 an und testen es mit verschiedenen Zahlenkonstellationen. Machen Sie sich die Verhaltensweise klar. Schreiben Sie die Vergleichsoperatoren um. Also »Vergleich auf größer« in »Vergleich auf kleiner«, »Vergleich auf kleinergleich« in »Vergleich auf kleiner« usw. Variieren Sie mit verschiedensten Konstellationen. Aber so, dass keine logische Veränderung auftritt, das Script also immer das Gleiche macht. Das heißt, Sie müssen auch die Zahlenangaben entsprechend dem Bedarf anpassen.

Kontrollfragen

Im Anhang »Antworten zu den Kontrollfragen« finden Sie die Antworten zu den jeweils am Ende einer Lektion notierten Fragen.

  1. Betrachten Sie die folgende Anweisung:
    a + b / c - d
  1. Was bedeutet der Operator || ?
  2. Was bedeutet der Operator != ?
  3. Ist das Script richtig?
    if(a=5)
    {
    alert("Test");
    }
  4. Was bedeutet der Operator && ?
  5. Ist der nachfolgende Bezeichner ein Schlüsselwort?
    Else
  6. Was bedeutet der Operator *= ?
  7. Ist der nachfolgende Bezeichner ein Schlüsselwort?
    funktion
  8. Was bedeutet der Operator % ?
  9. Ist der nachfolgende Bezeichner ein Schlüsselwort?
    do     
  10. Ist der nachfolgende Bezeichner ein Schlüsselwort?
    false
  11. Was bedeutet der Operator += ?
  12. Ist der nachfolgende Bezeichner ein Schlüsselwort?
    For
  13. Ist der nachfolgende Bezeichner ein Schlüsselwort?
    retrun



vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbackKapitelanfangnächstes Kapitel


© Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH