JavaScript – Das Handbuch für die Praxis. David Flanagan

Читать онлайн.
Название JavaScript – Das Handbuch für die Praxis
Автор произведения David Flanagan
Жанр Математика
Серия
Издательство Математика
Год выпуска 0
isbn 9783960104926



Скачать книгу

den Inhalt von if- und else-Anweisungen (und auch anderen zusammengesetzten Anweisungen wie while-Schleifen) grundsätzlich in geschweifte Klammern ein, auch wenn dieser Inhalt nur aus einer einzigen Anweisung besteht. Hält man sich konsequent daran, kann man die gerade demonstrierten Probleme vermeiden. Deshalb ich rate Ihnen, diese Praxis zu übernehmen! In diesem Buch ist es mir allerdings vor allem wichtig, den Beispielcode möglichst kurz zu halten, und ich muss gestehen, dass ich damit meinem eigenen Ratschlag hier selbst nicht folge.

       5.3.2else if

      Die if/else-Anweisung wertet einen Ausdruck aus und führt abhängig vom Ergebnis eine von zwei Codealternativen aus. Aber was ist, wenn es mehr als zwei Alternativen gibt? Eine Lösung für dieses Problem bietet die else if-Anweisung. else if ist eigentlich keine JavaScript-Anweisung, sondern ein häufig eingesetztes Programmieridiom, das entsteht, wenn mehrere if/else-Anweisungen kombiniert werden:

      if (n === 1) {

      // Codeblock #1 ausführen.

      } else if (n === 2) {

      // Codeblock #2 ausführen.

      } else if (n === 3) {

      // Codeblock #3 ausführen.

      } else {

      // Wenn alles andere fehlschlägt, Block #4 ausführen.

      }

      An diesem Code ist nichts Bemerkenswertes. Es ist einfach eine Folge von if-Anweisungen, bei denen jedes folgende if ein Teil der else-Klausel der vorhergehenden Anweisung ist. Das else if-Idiom ist empfehlenswerter und besser lesbar als die syntaktisch äquivalente vollständig geschachtelte Form dieser Anweisungen:

      if (n === 1) {

      // Codeblock #1 ausführen.

      }

      else {

      if (n === 2) {

      // Codeblock #2 ausführen.

      }

      else {

      if (n === 3) {

      // Codeblock #3 ausführen.

      }

      else {

      // Wenn alles andere fehlschlägt, Block #4 ausführen.

      }

      }

      }

       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