Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 125

5.3.3switch

Оглавление

Eine if-Anweisung bewirkt eine Verzweigung im Ablauf der Programmauswertung, und das else if-Idiom ermöglicht mehrere Verzweigungen. Es ist jedoch nicht die beste Lösung, wenn alle Zweige vom Wert des gleichen Ausdrucks abhängen. In diesem Fall wäre es überflüssig, den gleichen Ausdruck in if-Anweisungen wiederholt auszuwerten.

Für genau diese Situation ist die switch-Anweisung gedacht. Auf das Schlüsselwort switch folgen ein Ausdruck in runden Klammern und ein Codeblock in geschweiften Klammern:

switch(Ausdruck){

Anweisungen

}

Die vollständige Syntax einer switch-Anweisung ist aber etwas komplexer. Verschiedene Stellen im Codeblock werden mit dem Schlüsselwort case (für »Fall«) gekennzeichnet, gefolgt von einem Ausdruck und einem Doppelpunkt. Wird eine switch-Anweisung ausgeführt, berechnet sie den Wert von Ausdruck und sucht dann nach einer case-Sprungmarke (einem Label), deren Ausdruck zum gleichen Wert ausgewertet wird (wobei die Gleichheit mittels ===-Operator geprüft wird). Findet sie eine passende Sprungmarke, beginnt sie, den Codeblock an der mit case markierten Anweisung auszuführen. Findet sie kein case mit einem passenden Wert, sucht sie nach einer Anweisung mit der Sprungmarke default. Gibt es auch keine default-Sprungmarke, führt die switch-Anweisung keinen der in ihr enthaltenen Codeblöcke aus.

switch ist eine schwer zu erklärende Anweisung, deren Funktionsweise sich anhand eines Beispiels erheblich leichter illustrieren lässt. Die folgende switch-Anweisung ist äquivalent zu den wiederholten if/else-Anweisungen aus dem vorhergehenden Abschnitt:

switch(n) {

case 1: // Hier beginnen, wenn n === 1.

// Codeblock #1 ausführen.

break; // Hier anhalten.

case 2: // Hier beginnen, wenn n === 2.

// Codeblock #2 ausführen.

break; // Hier anhalten.

case 3: // Hier beginnen, wenn n === 3.

// Codeblock #3 ausführen.

break; // Hier anhalten.

default: // Wenn alles andere scheitert.

// Codeblock #4 ausführen.

break; // Hier anhalten.

}

Beachten Sie den Einsatz des Schlüsselworts break am Ende der einzelnen case-Abschnitte. Die break-Anweisung, die weiter unten in diesem Kapitel beschrieben wird, veranlasst den Interpreter, zum Ende der switch-Anweisung zu springen (oder aus ihr »auszubrechen«) und mit der auf sie folgenden Anweisung fortzufahren. Die case-Sprungmarken in einer switch-Anweisung markieren nur den Anfangspunkt des auszuführenden Codes, aber keinen Endpunkt. Gäbe es keine break-Anweisungen, würde switch mit der Ausführung seines Codeblocks dort beginnen, wo sich die case-Sprungmarke mit dem Wert befindet, der ihrem Ausdruck entspricht, und so lange mit der Ausführung von Anweisungen fortfahren, bis das Ende des gesamten Codes erreicht ist. In sehr seltenen Fällen kann tatsächlich Code nützlich sein, der auf diese Weise von einer case-Sprungmarke zur nächsten weiterläuft oder »durchfällt«. In 99 Prozent aller Fälle sollten Sie aber sorgfältig darauf achten, dass Sie jedes case mit einer break-Anweisung abschließen. (Wenn Sie switch innerhalb einer Funktion einsetzen, können Sie statt break auch return einsetzen. Beides beendet die switch-Anweisung und verhindert, dass die Ausführung zum nächsten case »durchfällt«.)

Hier ein etwas realistischeres Beispiel für eine switch-Anweisung, das einen Wert in Abhängigkeit von seinem Typ in einen String umwandelt:

function convert(x) {

switch(typeof x) {

case "number": // Umwandeln der Zahl in eine hexadezimale Ganzzahl.

return x.toString(16);

case "string": // Den String in Anführungszeichen eingeschlossen

// zurückgeben.

return '"' + x + '"';

default: // Umwandeln aller anderen Typen auf die

// übliche Weise.

return String(x);

}

}

Beachten Sie bitte, dass in den beiden vorherigen Beispielen auf das case Zahl- bzw. String-Literale folgen. So wird die switch-Anweisung in der Praxis am häufigsten verwendet. Der ECMAScript-Standard erlaubt es aber, nach einem case einen beliebigen Ausdruck zu verwenden.

Die switch-Anweisung wertet zuerst den Ausdruck aus, der auf das switch-Schlüsselwort folgt, und evaluiert danach die case-Ausdrücke in der Reihenfolge ihres Auftretens, bis sie einen Wert findet, der mit dem Schlüsselwort übereinstimmt.1 Ob dies zutrifft, wird mit dem strikten Gleichheitsoperator === geprüft, nicht mit dem nicht-strikten Gleichheitsoperator ==, sodass die Ausdrücke übereinstimmen müssen, ohne dass dabei eine Typumwandlung vorgenommen wird.

Da bei der Ausführung einer switch-Anweisung nicht notwendigerweise alle case-Ausdrücke ausgewertet werden, sollten Sie case-Ausdrücke mit Seiteneffekten wie Funktionsaufrufe oder Zuweisungen vermeiden. Der sicherste Weg ist, Ihre case-Ausdrücke grundsätzlich auf konstante Ausdrücke zu beschränken.

Wenn keiner der case-Ausdrücke mit dem switch-Ausdruck übereinstimmt, beginnt die switch-Anweisung, wie bereits erläutert, mit der Ausführung ihres Inhalts bei der mit default markierten Anweisung. Gibt es keine default-Sprungmarke, überspringt die switch-Anweisung ihren Codeblock vollständig. Beachten Sie bitte, dass sich in den gezeigten Beispielen die Sprungmarke default am Ende des switch-Anweisungsblocks nach allen case-Sprungmarken befindet. Das ist der logische und übliche Platz dafür, aber tatsächlich darf sie überall im Block der Anweisung erscheinen.

JavaScript  –  Das Handbuch für die Praxis

Подняться наверх