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 einzelnesa = b
eine Zuordnung bedeutet. - Nicht gleich. In der Mathematik lautet die Notation
≠
, aber in JavaScript wird sie alsa != 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:
- Vergleichen Sie das erste Zeichen beider Zeichenketten.
- 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.
- Ansonsten, wenn die ersten Zeichen beider Zeichenketten gleich sind, vergleiche die zweiten Zeichen auf die gleiche Weise.
- Wiederhole den Vorgang bis zum Ende einer der beiden Zeichenketten.
- 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:
-
G
ist gleichG
. -
l
ist gleichl
. -
o
ist größer alse
. Hier aufhören. Die erste Zeichenkette ist größer.
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
Es ist möglich, dass gleichzeitig:
- zwei Werte gleich sind.
- Einer davon ist
true
als boolescher Wert und der andere istfalse
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)
liefernfalse
, weilundefined
inNaN
umgewandelt wird undNaN
ein spezieller numerischer Wert ist, der bei allen Vergleichenfalse
liefert. - Die Gleichheitsprüfung
(3)
liefertfalse
, weilundefined
nurnull
,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, dienull/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
undundefined
sind gleich==
und nicht gleich einem anderen Wert. - Sei vorsichtig, wenn du Vergleiche wie
>
oder<
mit Variablen verwendest, die gelegentlichnull/undefined
sein können. Es ist eine gute Idee, separat aufnull/undefined
zu prüfen.