JavaScript für Ungeduldige. Cay Horstmann. Читать онлайн. Newlib. NEWLIB.NET

Автор: Cay Horstmann
Издательство: Bookwire
Серия:
Жанр произведения: Математика
Год издания: 0
isbn: 9783969100943
Скачать книгу
x != null prüft, ob beides nicht der Fall ist. Einige Programmierer, die gewöhnlich auf schwache Vergleiche verzichten, machen in diesem Fall eine Ausnahme.

       2.7Boolesche Operatoren

      In JavaScript gibt es drei Operatoren, um boolesche Werte zu kombinieren:

&& und
|| oder
! nicht

      Der Ausdruck x && y ist true, wenn sowohl x als auch y zu true ausgewertet werden. x || y ist true, wenn mindestens x oder y zu true ausgewertet wird. Der Ausdruck !x ist true, wenn x false ist.

      Die Operatoren && und || werden träge ausgewertet (Lazy Evaluation). Wenn bereits der linke Operand das Ergebnis eindeutig bestimmt (wenn es sich bei && um einen Falsy- oder bei || um einen Truthy-Wert handelt), wird der rechte Operand nicht mehr ausgewertet. Das kann sehr praktisch sein, wie das folgende Beispiel zeigt:

      if (i < a.length && a[i] > 0) // a[i] > 0 wird nicht ausgewertet, wenn

      // i ≥ a.length

      Die Operatoren && und || zeigen noch ein anderes merkwürdiges Verhalten, wenn die Operanden keine booleschen Werte sind. In diesem Fall wird einer der beiden Operanden als Wert des Ausdrucks herangezogen. Entscheidet der linke Operand das Ergebnis, so ist er der Wert des Ausdrucks. Der rechte Operand wird dann nicht mehr ausgewertet. Anderenfalls ist der Wert des Ausdrucks der Wert des rechten Operanden.

      Betrachten Sie dazu die folgenden Beispiele:

      0 && 'Harry' // 0

      0 || 'Harry' // 'Harry'

      In dem Versuch, dieses Verhalten auszunutzen, schreiben manche Programmierer Code wie den folgenden:

      let result = arg && arg.someMethod()

      Damit soll vor dem Aufruf der Methode sichergestellt werden, dass arg nicht undefined oder null ist. Wenn das der Fall wäre, so hätte auch result den Wert undefined oder null. Allerdings versagt diese Technik, wenn arg ein leerer String, 0 oder false ist.

      Eine weitere Anwendung besteht darin, einen Standardwert bereitzustellen, wenn eine Methode undefined oder null zurückgibt:

      let result = arg.someMethod() || defaultValue

      Auch das funktioniert aber nicht mehr, wenn die Methode 0, einen leeren String oder false zurückgeben kann.

      Für solche Fälle wäre eine komfortable Möglichkeit praktisch, um einen Wert nur dann zu verwenden, wenn er nicht undefined oder null ist. Zwei Operatoren für diesen Zweck sind zurzeit (Anfang 2020) noch Vorschläge der Stufe 3, was bedeutet, dass sie wahrscheinlich in spätere Versionen von JavaScript aufgenommen werden.

      Der Ausdruck x ?? y gibt x zurück, wenn x nicht undefined oder null ist, und anderenfalls y. In dem folgenden Ausdruck wird der Standardwert defaultValue nur dann verwendet, wenn die Methode undefined oder null zurückgibt:

      let result = arg.someMethod() ?? defaultValue

      Der Ausdruck x?.Eigenschaftsname ergibt die genannte Eigenschaft, wenn x nicht undefined oder null ist, und anderenfalls undefined. Betrachten Sie dazu folgendes Beispiel:

      let recipient = person?.name

      Wenn person weder undefined noch null ist, dann ist die rechte Seite genau gleichwertig mit person.name. Ist person dagegen undefined oder null, wird recipient auf undefined gesetzt. Hätten Sie in diesem Fall den Operator . statt ?. verwendet, wäre eine Exception aufgetreten.

      Sie können ?.-Operatoren auch verketten:

      let recipientLength = person?.name?.length

      Wenn person oder person.name zu undefined oder null ausgewertet wird, wird recipientLength auf undefined gesetzt.

image

       Hinweis

      In JavaScript gibt es auch die bitweisen Operatoren &, |, ^ und ~, die ihre Operanden ebenso wie ihre Gegenstücke in Java und C++ erst auf 32-Bit-Integer beschneiden und dann deren Bits kombinieren. Außerdem gibt es die Verschiebeoperatoren <<, >> und >>>, die Bits verschieben und dabei den linken Operanden auf einen 32-Bit- und den rechten auf einen 5-Bit-Integer beschneiden. Wenn Sie tatsächlich die einzelnen Bits von 32-Bit-Integern bearbeiten müssen, verwenden Sie diese Operatoren. Ansonsten sollten Sie jedoch lieber die Finger davon lassen.

image

      Vorsicht

      Manche Programmierer verwenden den Ausdruck x | 0, um die Nachkommastellen einer Zahl x zu entfernen. Das führt bei x ≥ 231 jedoch zu falschen Ergebnissen. Besser ist es, stattdessen Math.floor(x) zu nutzen.

       2.8Die switch-Anweisung

      Die switch-Anweisung funktioniert in JavaScript genauso wie in C, C++, Java und C#. Wenn Sie bereits damit vertraut sind, können Sie diesen Abschnitt getrost überspringen.

      In einer switch-Anweisung wird ein Ausdruck mit vielen möglichen Werten verglichen, wie das folgende Beispiel zeigt:

      let description = ''

      switch (someExpression) {

      case 0:

      description = 'zero'

      break

      case false:

      case true:

      description = 'boolean'

      break

      case '':

      description = 'empty string' // Siehe den Vorsicht-Kasten weiter hinten

      default:

      description = 'something else'

      }

      Die Ausführung beginnt bei dem case-Label, das strikt gleich dem Wert des Ausdrucks ist, und läuft bis zur nächsten break-Anweisung oder bis zum Ende der switch-Anweisung. Stimmt keines der case-Labels mit dem Wert überein, beginnt die Ausführung am default-Label, sofern eines vorhanden ist. Da auf strikte Gleichheit geprüft wird, darf es sich bei den case-Labels nicht um Objekte handeln.

image

      Vorsicht

      Wenn Sie am Ende einer der Alternativen die break-Anweisung vergessen, fällt die Ausführung bis zur nächsten Alternative durch! Das geschieht in dem vorherigen Beispiel, wenn value der leere String ist. Dadurch wird description erst auf 'empty string' und dann auf 'something else' gesetzt. Dieses Durchfallen ist gefährlich und eine häufige Fehlerursache. Daher verzichten manche Entwickler auf switch-Anweisungen.

image

      Tipp

      In vielen Fällen ist der Leistungsunterschied zwischen einer switch-Anweisung und einer gleichwertigen Folge von if-Anweisungen zu vernachlässigen. Wenn Sie switch