Die Anleitung für Anfänger zum Schreiben von Zwang Ein praktisches Beispiel

In dieser Artikelserie haben wir über Typenzwang gesprochen, wie er sich von der Typumwandlung unterscheidet und wie er sich in dynamisch typisierten Sprachen verhält.

Wenn Sie gerade an der Serie teilnehmen, lesen Sie die früheren Artikel, um sich auf dem neuesten Stand zu halten, wo wir gerade sind:

  1. Datentypen
  2. Was ist Typ Nötigung?? 

Während sich der andere Artikel auf schwach typisierte Sprachen und Datentypen auf hohem Niveau konzentrierte, werden wir uns einige spezifische Beispiele für Typuszwang in einer schwach typisierten Sprache und die Fallstricke ansehen, die wir erfahren können, ohne zu wissen, wie Typuszwang funktioniert und wie es nach hinten losgehen kann.

Im Besonderen werden wir uns einige Beispiele mit JavaScript ansehen, und obwohl die Ergebnisse, die Sie durch die Verwendung der Beispiele sehen, nicht unbedingt 1: 1 in andere Sprachen übersetzen, bieten sie dennoch eine Reihe von Tests, die Sie verwenden Sie können in Ihrem Alltag oder in Ihren Nebenprojekten Leistungen erbringen, die Sie verwenden, und die Ergebnisse, die Sie sehen, auswerten.

Die Regeln des Vergleichs

Wenn wir Vergleiche anstellen, ist eines der häufigsten Probleme, das in schwach typisierten Sprachen auftritt. Sicher, es gibt andere Zeiten, in denen die Erwartung, dass eine Variable ein Typ ist, wenn es sich tatsächlich um einen anderen handelt, negative Auswirkungen auf uns haben kann. Die häufigsten Probleme treten jedoch auf, wenn wir einen Vergleich durchführen.

Diese Vergleiche können in Form von Gleichheitsoperationen, bedingten Operationen, bitweisen Operationen oder während auftreten Schaltergehäuse Operationen. 

Wie bereits in früheren Artikeln dieser Serie erwähnt, haben verschiedene Sprachen unterschiedliche Möglichkeiten, Datentypen zu erzwingen, sodass die Beispiele, die wir in diesem Artikel betrachten, in der Arbeit, die Sie ausführen, ein wenig abweichen können. 

Das heißt, wir werden uns diese Beispiele mit JavaScript ansehen, da sie eine so weit verbreitete Sprache ist, aber die Regeln sind immer noch in anderen Sprachen anwendbar - es ist nur so, dass andere Sprachen einem anderen Datentyp eine andere Priorität einräumen Die Ergebnisse von Zwang können etwas anders sein.

Schauen wir uns also an, wie JavaScript Vergleiche zwischen Datentypen mit dem Gleichheitsoperator handhabt (==), der strikte Gleichheitsoperator (===) und bei Verwendung von Werten wie nicht definiert und Null.

Null und Undefiniert

Bevor wir Vergleiche zwischen verschiedenen Datentypen betrachten, nehmen wir uns einen Moment Zeit, um dies in JavaScript zu beachten, nicht definiert und Null sind zwei verschiedene Arten von Werten. Als wäre das nicht genug, kann es beim Vergleich der beiden Werte noch verwirrender werden.

Beachten Sie zunächst Folgendes:

  • Wenn Sie ausführen würden typeof (undefined) in der Konsole wäre dann das Ergebnis nicht definiert.
  • Wenn Sie hingerichtet werden sollten typeof (null) in der Konsole wäre dann das Ergebnis Objekt.

Wenn Sie als Nächstes eine Variable deklarieren, ohne ihr tatsächlich einen Wert zuzuweisen, und den Typ bewerten, werden Sie sehen nicht definiert.

/ ** * Eine Variable 'name' deklarieren, aber keinen Wert zuweisen. * Führen Sie das Ergebnis von 'typeof' auf einer Konsole aus, und Sie erhalten * undefined. * / var name; typeof (name);

Nehmen wir an, dass wir die Variable mit einem initialisieren Null Wert. Wenn Sie die Variable mit auswerten würden Art der Ihnen würde eine gegeben werden Objekt Ergebnis.

// Zuerst werden wir die Variable var number deklarieren. / ** * Wenn wir an dieser Stelle die Variable * mit typeof auswerten würden, würden wir 'undefined' erhalten. * / // Weisen Sie der Variablen jetzt einen Wert von 'null' zu. Number = null; / ** * Und werte die Variable aus. An diesem Punkt wird * der Wert von 'object' zurückgegeben. * / typeof (Nummer);

Verwirrend? Erinnern Sie sich von früher an das in JavaScript, Null ist ein Objekt Dabei ist undefined der eigene Typ - nicht definiert

Nachdem dies gesagt wurde, können wir nun tatsächlich betrachten, warum Vergleiche schwierig werden können, wenn wir Vergleiche mit Werten durchführen, ohne ihren Typ explizit zu kennen.

Vergleiche

In diesem Abschnitt werden wir die Ergebnisse eines Vergleichs von Werten verschiedener Typen betrachten, aber sie werden sehen, wie sie miteinander verglichen werden, indem sowohl Gleichheitsvergleiche als auch strenge Gleichheitsvergleiche verwendet werden.

Beachten Sie, dass alle Beispiele, die wir nachfolgend aufführen, in der Browserkonsole wie Firebug oder den Developer Tools von Chrome ausgeführt werden können. 

Für den Anfang beginnen wir mit nicht definiert und Null.

// Gibt true zurück undefined == null; null == undefiniert; // Gibt falsch undefined zurück === null; null === undefiniert;

Beachten Sie, dass der Gleichheitsoperator im ersten Fall einen Vergleichswert zurückgibt nach dem Typ Zwang durchführen. Das heißt, der Interpreter schätzt, was wir unter diesem Vergleich verstehen.

Im zweiten Fall verwenden wir den strengen Gleichheitsoperator. In diesem Fall tritt kein Typendruck auf. Stattdessen werden die Werte genau so übernommen und verglichen.

Lassen Sie uns als Nächstes die Variable deklarieren, keinen Wert zuweisen und dann einen Vergleich ausführen.

// Die Variable deklarieren, ihr keinen Wert zuweisen var Beispiel; // Wenn mit undefined verglichen wird, wird in beiden Fällen true zurückgegeben. Example == undefined; Beispiel === undefined // Gibt im Vergleich zu Null wahr oder falsch zurück. Beispiel == Null; // wahres Beispiel === null; // false // Weisen Sie der Variablen einen Wert zu. example = null; // Mach jetzt ein strenges Vergleichsbeispiel === null; // Gibt true zurück

Wie Sie sehen, wird die Sache etwas komplizierter, wenn wir beginnen, Variablen mit oder ohne Werte zu deklarieren und zu vergleichen.

Wenn wir anfangen, Strings, Zahlen und boolesche Werte einzuführen, kann dies noch komplizierter werden. Beginnen wir mit Strings und Zahlen. Wir beginnen mit der Deklaration einer Variablen mit einem Zeichenfolgewert von 42 und eine Nummer mit der 42 und dann führen wir unsere Vergleiche durch. 

var sNumber, iNumber; sNumber = '42'; iNumber = 42; // Gleichheitsvergleiche ergeben true sNumber == iNumber; // Strenger Vergleich ergibt false sNumber === iNumber;

Beachten Sie im ersten Fall, dass der Interpreter versucht, die Werte aus den Variablen zu erzwingen und sie dann zu vergleichen. Im ersten Fall funktioniert es - wir vergleichen einen String-Wert von 42 auf einen Zahlenwert von 42, aber wenn wir den strengen Gleichheitsvergleich verwenden und bekommen falsch.

Der zweite Fall ist technisch genauer, da der erste Wert eine Zeichenfolge und der zweite eine Zahl ist. Der Vergleich zweier Werte verschiedener Typen sollte immer falsch sein.

Obwohl wir uns dies in einem früheren Artikel angeschaut haben, ist der Fall von Zahlen und Booleschen Zahlen?

var iNumber, bBoolean; iNumber = 0; bBoolean = false; // Gibt true zurück iNumber == bBoolean; // Gibt false zurück iNumber === bBoolean; // Gibt true zurück iNumber = 1; bBoolean = true; iNumber == bBoolean; // Gibt false zurück iNumber === bBoolean;

An diesem Punkt sollten Sie ein Muster bemerken: Wenn Sie Werte verschiedener Typen vergleichen, zwingt JavaScript Werte möglicherweise richtig, aber es liefert das genaueste Ergebnis, wenn Sie den strengen Gleichheitsoperator verwenden.

Abschließend betrachten wir ein Beispiel, das Strings, Zahlen und Booleans kombiniert.

var sExample, iExample, bExample; sExample = '1'; iExample = 1; bExample = true; // Gibt true zurück sExample == iExample; // Gibt false zurück sExample === iExample; // Gibt true zurück iExample == bExample; // Gibt false zurück iExample === bExample; // Gibt true zurück sExample == bExample; // Gibt false zurück sExample === bExample;

Beachten Sie, dass dies grundlegende Vergleiche sind. wenn jedoch im Rahmen einer ansonsten oder wenn / sonst wenn / sonst Sie sehen, wie es den Kontrollfluss durch die Bedingung unterbrechen kann.

Noch etwas?

Beachten Sie Folgendes, wenn Sie logische Operationen wie z && und || sowie bitweise Operatoren wie & und | dass die Zwangsregeln immer noch gelten. Zu diesem Zweck möchten Sie sicherstellen, dass beim Ausführen dieser Vorgänge Werte desselben Typs verwendet werden, um die genauesten Ergebnisse zu erhalten.

Andernfalls kann Zwang zu einem falschen oder einem negativen Ergebnis führen.

Fazit

Dies vervollständigt den flüchtigen Blick von Anfängern auf Datentypen und die Typübernahme in dynamisch typisierten Sprachen. Letztendlich gilt als Faustregel, immer strikte Gleichheitsoperatoren zu verwenden und sicherzustellen, dass die Variablen, mit denen Sie arbeiten, denselben Typ haben. Wenn Sie sich nicht sicher sind, können Sie sie explizit mithilfe von Strategien konvertieren, die wir zuvor in der Serie beschrieben haben.

In dieser ganzen Serie haben wir uns einen Überblick darüber gemacht, wie Typen von stark typisierten Sprachen zu schwach typisierten Sprachen variieren und sich verhalten. Wir haben untersucht, wie sich Casting und Nötigung unterscheiden, und wir haben einige der möglichen Fallstricke untersucht, die dazu führen können, dass der Dolmetscher oder der Compiler beim Vergleichen zu stark abhängig ist.

Schließlich haben wir uns einige Strategien angesehen, wie man defensiveren Code schreiben kann, indem wir sicherstellen, dass wir den Datentyp haben, den wir benötigen, und wie strikte Vergleichsoperatoren verwendet werden, um sicherzustellen, dass wir die Ergebnisse erhalten, die wir benötigen.

Wie bereits erwähnt, haben wir in unseren Artikeln zu diesem Zweck JavaScript verwendet, aber andere schlecht typisierte Sprachen unterliegen denselben Fallstricken. Wie sie ihre Zwänge priorisieren, ist unterschiedlich, aber die in dieser Serie beschriebenen Strategien sollten dazu beitragen, widerstandsfähigeren Code zu schreiben, wenn in schwach typisierten Sprachen gearbeitet wird.