JavaScript für Ungeduldige. Cay Horstmann

Чтение книги онлайн.

Читать онлайн книгу JavaScript für Ungeduldige - Cay Horstmann страница 21

Автор:
Серия:
Издательство:
JavaScript für Ungeduldige - Cay Horstmann

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

die folgenden Beispiele:

      '' == 0 // true: '' wird in 0 umgewandelt

      '0' == 0 // true: '0' wird in 0 umgewandelt

      '0' == false // true: Beide Operanden werden in 0 umgewandelt

      undefined == false // false: undefined ist nur zu null und sich selbst gleich

      Schauen wir uns noch einmal die beiden Strings '' und '0' an. Sie sind beide gleich 0, aber nicht zueinander gleich:

      '' == '0' // false: Beide Operanden sind Strings, daher keine Umwandlung

      Wie Sie sehen, sind die Regeln für schwache Vergleiche nicht sehr nützlich und können leicht zu schwer aufzuspürenden Fehlern fühlen. Vermeiden Sie diesen Sumpf, indem Sie nur die strikten Gleichheitsoperatoren === und !== verwenden.

image

       Hinweis

      Der schwache Vergleich x == null prüft in Wirklichkeit, ob x den Wert undefined oder null hat, und 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

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