Vergleiche

author
6 minutes, 7 seconds Read

Viele Vergleichsoperatoren kennen wir aus der Mathematik.

In JavaScript werden sie so geschrieben:

  • Größer/kleiner als: a > b, a < b.
  • Größer/kleiner als oder gleich: a >= b, a <= b.
  • Gleich: a == b, bitte beachten Sie, dass das doppelte Gleichheitszeichen == die Gleichheitsprüfung bedeutet, während ein einzelnes a = b eine Zuordnung bedeutet.
  • Nicht gleich. In der Mathematik lautet die Notation , aber in JavaScript wird sie als a != b geschrieben.

In diesem Artikel erfahren wir mehr über verschiedene Arten von Vergleichen, wie JavaScript sie durchführt, einschließlich wichtiger Besonderheiten.

Am Ende finden Sie ein gutes Rezept, um Probleme mit „JavaScript-Macken“ zu vermeiden.

Boolean ist das Ergebnis

Alle Vergleichsoperatoren geben einen booleschen Wert zurück:

  • true – bedeutet „ja“, „richtig“ oder „die Wahrheit“.
  • false – bedeutet „nein“, „falsch“ oder „nicht die Wahrheit“.

Zum Beispiel:

alert( 2 > 1 ); // true (correct)alert( 2 == 1 ); // false (wrong)alert( 2 != 1 ); // true (correct)

Ein Vergleichsergebnis kann einer Variablen zugewiesen werden, wie jeder andere Wert auch:

let result = 5 > 4; // assign the result of the comparisonalert( result ); // true

Zeichenfolgenvergleich

Um festzustellen, ob eine Zeichenfolge größer als eine andere ist, verwendet JavaScript die sogenannte „Wörterbuch“- oder „lexikografische“ Reihenfolge.

Mit anderen Worten, Zeichenketten werden Buchstabe für Buchstabe verglichen.

Zum Beispiel:

alert( 'Z' > 'A' ); // truealert( 'Glow' > 'Glee' ); // truealert( 'Bee' > 'Be' ); // true

Der Algorithmus zum Vergleich zweier Zeichenketten ist einfach:

  1. Vergleichen Sie das erste Zeichen beider Zeichenketten.
  2. Wenn das erste Zeichen der ersten Zeichenfolge größer (oder kleiner) ist als das der anderen Zeichenfolge, dann ist die erste Zeichenfolge größer (oder kleiner) als die zweite. Das war’s.
  3. Ansonsten, wenn die ersten Zeichen beider Zeichenketten gleich sind, vergleiche die zweiten Zeichen auf die gleiche Weise.
  4. Wiederhole den Vorgang bis zum Ende einer der beiden Zeichenketten.
  5. Wenn beide Zeichenketten mit der gleichen Länge enden, dann sind sie gleich. Andernfalls ist die längere Zeichenkette größer.

Im ersten Beispiel oben kommt der Vergleich 'Z' > 'A' im ersten Schritt zu einem Ergebnis.

Der zweite Vergleich 'Glow' und 'Glee' benötigt mehr Schritte, da die Zeichenfolgen Zeichen für Zeichen verglichen werden:

  1. G ist gleich G.
  2. l ist gleich l.
  3. o ist größer als e. Hier aufhören. Die erste Zeichenkette ist größer.

Kein echtes Wörterbuch, sondern eine Unicode-Reihenfolge

Der oben angegebene Vergleichsalgorithmus entspricht in etwa dem, der in Wörterbüchern oder Telefonbüchern verwendet wird, aber er ist nicht genau derselbe.

Zum Beispiel spielt die Großschreibung eine Rolle. Ein Großbuchstabe "A" ist nicht gleich dem Kleinbuchstaben "a". Welcher Buchstabe ist größer? Der Kleinbuchstabe "a". Und warum? Weil der Kleinbuchstabe einen größeren Index in der internen Kodierungstabelle hat, die JavaScript verwendet (Unicode). Wir werden im Kapitel Strings auf die Einzelheiten und Konsequenzen zurückkommen.

Vergleich verschiedener Typen

Beim Vergleich von Werten verschiedener Typen konvertiert JavaScript die Werte in Zahlen.

Zum Beispiel:

alert( '2' > 1 ); // true, string '2' becomes a number 2alert( '01' == 1 ); // true, string '01' becomes a number 1

Für boolesche Werte wird true zu 1 und false zu 0.

Zum Beispiel:

alert( true == 1 ); // truealert( false == 0 ); // true

Eine lustige Folge

Es ist möglich, dass gleichzeitig:

  • zwei Werte gleich sind.
  • Einer davon ist true als boolescher Wert und der andere ist false als boolescher Wert.

Zum Beispiel:

let a = 0;alert( Boolean(a) ); // falselet b = "0";alert( Boolean(b) ); // truealert(a == b); // true!

Aus Sicht von JavaScript ist dieses Ergebnis ganz normal. Eine Gleichheitsprüfung konvertiert Werte unter Verwendung der numerischen Konvertierung (daher wird "0" zu 0), während die explizite Boolean-Konvertierung einen anderen Satz von Regeln verwendet.

Strenge Gleichheit

Eine reguläre Gleichheitsprüfung == hat ein Problem. Sie kann 0 nicht von false unterscheiden:

alert( 0 == false ); // true

Das Gleiche passiert mit einer leeren Zeichenfolge:

alert( '' == false ); // true

Dies geschieht, weil Operanden unterschiedlichen Typs durch den Gleichheitsoperator == in Zahlen umgewandelt werden. Eine leere Zeichenkette wird, genau wie false, zu einer Null.

Was tun, wenn wir 0 von false unterscheiden wollen?

Ein strenger Gleichheitsoperator === prüft die Gleichheit ohne Typumwandlung.

Mit anderen Worten, wenn a und b von unterschiedlichem Typ sind, dann gibt a === b sofort false zurück, ohne den Versuch, sie zu konvertieren.

Versuchen wir es:

alert( 0 === false ); // false, because the types are different

Es gibt auch einen „strengen Nicht-Gleichheits“-Operator !== analog zu !=.

Der strikte Gleichheitsoperator ist etwas länger zu schreiben, macht aber deutlich, was vor sich geht und lässt weniger Raum für Fehler.

Vergleich mit null und undefiniert

Es gibt ein nicht intuitives Verhalten, wenn null oder undefined mit anderen Werten verglichen werden.

Für eine strenge Gleichheitsprüfung===

Diese Werte sind unterschiedlich, weil jeder von ihnen ein anderer Typ ist.

alert( null === undefined ); // false

Für eine nicht strenge Prüfung==

Es gibt eine besondere Regel. Diese beiden sind ein „süßes Paar“: Sie sind einander gleich (im Sinne von ==), aber keinem anderen Wert.

alert( null == undefined ); // true

Für Mathematik und andere Vergleiche werden< > <= >=

null/undefined in Zahlen umgewandelt: null wird zu 0, während undefined zu NaN wird.

Nun sehen wir uns einige lustige Dinge an, die passieren, wenn wir diese Regeln anwenden. Und, was noch wichtiger ist, wie man damit nicht in eine Falle tappt.

Kurioses Ergebnis: Null vs. 0

Lassen Sie uns null mit einer Null vergleichen:

alert( null > 0 ); // (1) falsealert( null == 0 ); // (2) falsealert( null >= 0 ); // (3) true

Mathematisch ist das seltsam. Das letzte Ergebnis besagt, dass „null größer oder gleich Null ist“, also muss es in einem der obigen Vergleiche true sein, aber beide sind falsch.

Das liegt daran, dass eine Gleichheitsprüfung == und Vergleiche > < >= <= unterschiedlich funktionieren. Vergleiche wandeln null in eine Zahl um und behandeln sie als 0. Deshalb ist (3) null >= 0 wahr und (1) null > 0 falsch.

Die Gleichheitsprüfung == für undefined und null ist dagegen so definiert, dass sie ohne Konvertierungen gleich sind und nichts anderes ergeben. Deshalb ist (2) null == 0 falsch.

Ein unvergleichbares Undefiniertes

Der Wert undefined soll nicht mit anderen Werten verglichen werden:

alert( undefined > 0 ); // false (1)alert( undefined < 0 ); // false (2)alert( undefined == 0 ); // false (3)

Warum mag es die Null so sehr? Immer falsch!

Wir erhalten diese Ergebnisse, weil:

  • Die Vergleiche (1) und (2) liefern false, weil undefined in NaN umgewandelt wird und NaN ein spezieller numerischer Wert ist, der bei allen Vergleichen false liefert.
  • Die Gleichheitsprüfung (3) liefert false, weil undefined nur null, undefined und keinem anderen Wert entspricht.

Probleme vermeiden

Warum sind wir diese Beispiele durchgegangen? Sollen wir uns diese Besonderheiten immer wieder ins Gedächtnis rufen? Nun, nicht wirklich. Eigentlich werden diese kniffligen Dinge mit der Zeit vertraut, aber es gibt eine solide Methode, um Probleme mit ihnen zu vermeiden:

  • Behandeln Sie jeden Vergleich mit undefined/null außer der strengen Gleichheit === mit außergewöhnlicher Vorsicht.
  • Verwenden Sie keine Vergleiche >= > < <= mit einer Variablen, die null/undefined sein kann, es sei denn, Sie sind sich wirklich sicher, was Sie tun. Wenn eine Variable diese Werte haben kann, prüfen Sie sie separat.

Zusammenfassung

  • Vergleichsoperatoren geben einen booleschen Wert zurück.
  • Zeichenfolgen werden Buchstabe für Buchstabe in der Reihenfolge des „Wörterbuchs“ verglichen.
  • Wenn Werte unterschiedlichen Typs verglichen werden, werden sie in Zahlen umgewandelt (mit Ausnahme einer strengen Gleichheitsprüfung).
  • Die Werte null und undefined sind gleich == und nicht gleich einem anderen Wert.
  • Sei vorsichtig, wenn du Vergleiche wie > oder < mit Variablen verwendest, die gelegentlich null/undefined sein können. Es ist eine gute Idee, separat auf null/undefined zu prüfen.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.