Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 96
4.9.2Vergleichsoperatoren
ОглавлениеDie Vergleichsoperatoren testen die relative Reihenfolge (numerisch oder alphabetisch) ihrer beiden Operanden:
Kleiner als (<)
Der Operator < wird zu true ausgewertet, wenn sein erster Operand kleiner als sein zweiter Operand ist; andernfalls wird er zu false ausgewertet.
Größer als (>)
Der Operator > wird zu true ausgewertet, wenn sein erster Operand größer als sein zweiter Operand ist; andernfalls wird er zu false ausgewertet.
Kleiner gleich (<=)
Der Operator <= wird zu true ausgewertet, wenn sein erster Operand kleiner als oder gleich seinem zweiten Operanden ist; andernfalls wird er zu false ausgewertet.
Größer gleich (>=)
Der Operator >= wird zu true ausgewertet, wenn sein erster Operand größer als oder gleich dem zweiten Operanden ist; andernfalls wird er zu false ausgewertet.
Die Operanden dieser Vergleichsoperatoren dürfen beliebigen Typs sein. Vergleiche können jedoch nur auf Zahlen und Strings durchgeführt werden. Operanden, die weder Strings noch Zahlen sind, werden also umgewandelt.
Vergleich und Umwandlung erfolgen nach diesen Regeln:
Wird einer der Operanden zu einem Objekt ausgewertet, wird dieses so in einen primitiven Wert umgewandelt, wie es am Ende von 3.9.3 beschrieben wurde: Liefert die valueOf()-Methode einen primitiven Wert, wird dieser genommen, andernfalls der Rückgabewert der Methode toString().
Sind nach eventuell erforderlichen Umwandlungen von Objekten in primitive Werte beide Operanden Strings, werden sie anhand ihrer alphabetischen Reihenfolge verglichen. Diese »alphabetische Reihenfolge« wird dabei durch die numerische Abfolge der 16-Bit-Unicode-Werte bestimmt, aus denen die Strings bestehen.
Ist nach den Umwandlungen von Objekten in primitive Werte mindestens einer der Operanden kein String, werden beide Operanden in Zahlen umgewandelt und numerisch verglichen. 0 und -0 werden als gleich betrachtet. Infinity ist größer als jede Zahl außer sich selbst, und -Infinity ist kleiner als jede Zahl außer sich selbst. Wenn einer der Operanden NaN ist (oder in diesen Wert umgewandelt wird), liefern die Vergleichsoperatoren immer false zurück. Obwohl die arithmetischen Operatoren nicht zulassen, dass BigInt-Werte mit regulären Zahlen gemischt werden, erlauben die Vergleichsoperatoren Vergleiche zwischen Zahlen und BigInts.
Denken Sie daran, dass JavaScript-Strings Folgen von 16-Bit-Ganzzahlen und String-Vergleiche nur numerische Vergleiche der in ihnen enthaltenen Werte sind. Die durch Unicode vorgegebene numerische Reihenfolge entspricht nicht notwendigerweise der traditionellen Sortierfolge, die in einer bestimmten Sprache oder einem bestimmten Gebietsschema (einer Locale) verwendet wird. Beachten Sie insbesondere, dass String-Vergleiche Groß-/Kleinschreibung berücksichtigen und dass alle ASCII-Großbuchstaben »kleiner als« alle ASCII-Kleinbuchstaben sind. Diese Regel kann zu verwirrenden Ergebnissen führen, wenn Sie auf dieses Verhalten nicht eingestellt sind. Beispielsweise würde der Operator < den String »Zoo« vor dem String »aal« einsortieren.
Einen robusteren Algorithmus für String-Vergleiche finden Sie in der Methode String.localeCompare(), die Locale-spezifische Definitionen der alphabetischen Reihenfolge berücksichtigt. Für Vergleiche, bei denen die Groß- und Kleinschreibung nicht berücksichtigt werden soll, können Sie Zeichenfolgen mit String.toLowerCase() oder String.toUpperCase() in Klein- oder Großbuchstaben konvertieren. Als allgemeineres und besser lokalisiertes Vergleichswerkzeug für Strings können Sie die in 11.7.3 beschriebene Intl.Collator-Klasse verwenden.
Der +-Operator und die Vergleichsoperatoren verhalten sich bei Zahl- und String-Operanden unterschiedlich. + bevorzugt Strings: Es wird eine Verkettung durchgeführt, wenn einer der Operanden ein String ist. Die Vergleichsoperatoren bevorzugen Zahlen und führen nur dann einen String-Vergleich durch, wenn beide Operanden Strings sind:
1 + 2 // => 3: Addition.
"1" + "2" // => "12": Verkettung.
"1" + 2 // => "12": 2 wird in "2" umgewandelt.
11 < 3 // => false: Numerischer Vergleich.
"11" < "3" // => true: String-Vergleich.
"11" < 3 // => false: Numerischer Vergleich, "11" wird in 11 umgewandelt.
"one" < 3 // => false: Numerischer Vergleich, "one" wird in NaN konvertiert.
Beachten Sie bitte auch, dass sich die Kleiner-gleich- und Größer-gleich-Operatoren <= und >= nicht auf den nicht-strikten oder strikten Gleichheitsoperator stützen, wenn sie prüfen, ob zwei Werte »gleich« sind. Stattdessen ist Kleiner-gleich einfach als »nicht größer als« und Größer-gleich als »nicht kleiner als« definiert. Die einzige Ausnahme tritt ein, wenn einer der Operanden NaN ist (oder dazu umgewandelt wird). In diesem Fall liefern alle vier Vergleichsoperatoren false.