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

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


Скачать книгу
Wollen Sie eine Klasse von Objekten von einer anderen unterscheiden, müssen Sie andere Techniken wie den instanceof-Operator (siehe 4.9.4), das class-Attribut (siehe 14.4.3) oder die constructor-Eigenschaft (siehe 9.2.2 und 14.3) nutzen.

       4.13.4Der delete-Operator

      delete ist ein unärer Operator, der versucht, die Objekteigenschaft oder das Array-Element zu löschen, das als sein Operand angegeben ist. Wie die Operatoren für Zuweisung, Inkrementierung und Dekrementierung wird delete üblicherweise wegen seines Seiteneffekts, Eigenschaften zu löschen, eingesetzt und nicht wegen des Werts, den er liefert. Ein paar Beispiele:

      let o = { x: 1, y: 2}; // Beginnen wir mit einem Objekt.

      delete o.x; // Eine seiner Eigenschaften löschen.

      "x" in o // => false: Die Eigenschaft gibt es nicht mehr.

      let a = [1,2,3]; // Ein Array definieren.

      delete a[2]; // Das letzte Array-Element löschen.

      2 in a // => false: Das Array-Element mit Index 2 existiert

      // nicht mehr.

      a.length // => 3: Beachten Sie, dass sich die Länge des Arrays

      // nicht ändert.

      Übrigens wird eine gelöschte Eigenschaft oder ein gelöschtes Array-Element nicht einfach auf undefined gesetzt. Wird eine Eigenschaft gelöscht, endet ihre Existenz. Ein Versuch, eine nicht (mehr) vorhandene Eigenschaft zu lesen, liefert undefined. Sie können aber auf die tatsächliche Existenz einer Eigenschaft mit dem in-Operator (siehe 4.9.3) prüfen. Löscht man ein Array-Element, entsteht eine »Lücke« im Array – die Länge des Arrays ändert sich dabei nicht. Das resultierende Array ist ein sogenanntes Sparse-Array (siehe 7.3).

      delete erwartet, dass sein Operand ein Lvalue ist. Ist er kein Lvalue, unternimmt der Operator nichts und liefert true. Andernfalls versucht delete, das angegebene Lvalue zu löschen. delete gibt true zurück, wenn der Operator das Lvalue erfolgreich löschen konnte. Allerdings sind nicht alle Eigenschaften löschbar: Nicht konfigurierbare Eigenschaften (siehe 14.1) sind immun gegen Löschungen.

      Im strict-Modus löst delete einen SyntaxError aus, wenn sein Operand ein nicht qualifizierter Identifier wie eine Variable, eine Funktion oder ein Funktionsparameter ist. Der Operator funktioniert also nur, wenn der Operand ein Eigenschaftszugriffsausdruck (siehe 4.4) ist. Der strict-Modus sorgt auch dafür, dass delete einen TypeError auslöst, wenn versucht wird, eine nicht konfigurierbare Eigenschaft zu löschen. Außerhalb des strict-Modus treten in diesen Fällen keine Ausnahmen auf. delete liefert einfach false, um anzuzeigen, dass der Operand nicht gelöscht werden konnte.

      Hier sind einige Beispiele zur Verwendung des delete-Operators:

      let o = {x: 1, y: 2};

      delete o.x; // Eine der Eigenschaften des Objekts löschen; liefert true.

      typeof o.x; // Die Eigenschaft gibt es nicht; liefert "undefined".

      delete o.x; // Eine nicht vorhandene Eigenschaft löschen; liefert true.

      delete 1; // Das ergibt zwar keinen Sinn, aber es liefert als Ergebnis true.

      // Eine Variable kann nicht gelöscht werden; gibt false oder – im strict-Modus –

      // einen SyntaxError zurück:

      delete o;

      // Nicht löschbare Eigenschaft; gibt false oder – im strict-Modus – einen

      // TypeError zurück:

      delete Object.prototype;

      Der delete-Operator wird uns noch einmal in 6.4 begegnen.

       4.13.5Der await-Operator

      await wurde in ES2017 als Möglichkeit eingeführt, die asynchrone Programmierung in JavaScript natürlicher zu gestalten. Um diesen Operator genau kennenzulernen, empfehle ich Ihnen Kapitel 13. Man kann den Operator aber kurz so beschreiben: await erwartet ein Promise-Objekt (das eine asynchrone Operation repräsentiert) als einzigen Operanden und veranlasst Ihr Programm, sich so zu verhalten, als würde es auf den Abschluss der asynchronen Operation warten. (Dies geschieht aber, ohne die Programmausführung tatsächlich zu blockieren, und es verhindert auch nicht, dass andere asynchrone Operationen zur gleichen Zeit ablaufen.) Der Wert des await-Operators ist der Erfüllungswert des Promise-Objekts. Wichtig dabei ist, dass await nur innerhalb von Funktionen zulässig ist, die mit dem Schlüsselwort async als asynchron deklariert wurden. Alle weiteren Einzelheiten finden Sie in Kapitel 13.

       4.13.6Der void-Operator

      void ist ein unärer Operator, der vor einem Operanden beliebigen Typs steht. Dieser Operator ist ungewöhnlich und wird nur selten eingesetzt: Er wertet seinen Operanden aus, verwirft den Wert aber dann und liefert undefined. Da der Wert des Operanden verworfen wird, ist void nur sinnvoll, wenn der Operand Seiteneffekte hat.

      Der Operator void ist derart seltsam, dass es schwierig ist, ein praktisches Beispiel für seine Anwendung zu finden. Aber nehmen wir an, Sie möchten eine Funktion definieren, die nichts zurückgibt, dabei aber die Pfeilnotation verwendet (siehe 8.1.3), bei der der Körper der Funktion also ein einzelner Ausdruck ist, der ausgewertet und zurückgegeben wird. Wenn Sie den Ausdruck nur wegen seiner Seiteneffekte auswerten und seinen Wert nicht zurückgeben wollen, ist es am einfachsten, den Funktionskörper in geschweifte Klammern einzufassen. Als Alternative könnten Sie in diesem Fall aber auch den void-Operator verwenden:

      let counter = 0;

      const increment = () => void counter++;

      increment() // => undefined

      counter // => 1

       4.13.7Der Kommaoperator (,)

      Der Kommaoperator ist ein binärer Operator, dessen Operanden beliebigen Typs sein können. Er wertet seinen linken Operanden aus, dann den rechten Operanden und liefert schließlich den Wert des rechten Operanden zurück. Die folgende Zeile

      i=0, j=1, k=2;

      wird deshalb zu 2 ausgewertet und entspricht im Prinzip:

      i = 0; j = 1; k = 2;

      Der Ausdruck auf der linken Seite wird immer ausgewertet, aber sein Wert wird verworfen. Der Einsatz des Kommaoperators ist also nur sinnvoll, wenn der linksseitige Ausdruck Seiteneffekte hat. Die einzige Situation, in der der Kommaoperator häufig verwendet wird, ist eine for-Schleife (siehe 5.4.3), die mehrere Schleifenvariablen hat:

      // Das erste Komma unten ist Teil der let-Anweisung,

      // das zweite der Kommaoperator: Damit quetschen wir zwei

      // Ausdrücke (i++ und j--) in eine Anweisung


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