Wie transformiert sich ein String-Objekt im Vergleich?

8
%Vor%

Ich möchte wissen, warum der letzte falsch wird. Und "20a" verwandelt sich in das, was vorher verglichen wurde.

    
user1726273 12.10.2012, 08:52
quelle

3 Antworten

7

Von der MDN-Seite aus Vergleichsoperatoren :

  

Bei relationalen abstrakten Vergleichen (z. B. & lt; =) werden die Operanden vor dem Vergleich zuerst in Grundelemente und dann in den gleichen Typ konvertiert.

%Vor%

Dies konvertiert "20" in eine Zahl 20 und vergleicht sie. Da 20 größer ist als 10 , ist es wahr.

%Vor%

Dies vergleicht die beiden Zeichenfolgen. Da "20a" (alphabetisch) größer ist als "10" , ist es wahr.

%Vor%

Dies konvertiert "20a" in eine Zahl. Das Ergebnis ist NaN (do +"20a" , um dies in Aktion zu sehen). NaN ist nicht größer als jede Zahl, daher wird false zurückgegeben.

    
lonesomeday 12.10.2012, 08:58
quelle
2

Der Vergleichsalgorithmus in ECMAScript wird hier beschrieben: Ссылка

  

Der Vergleich x & lt; y, wo x und y Werte sind, erzeugt wahr, falsch,   oder undefined (was anzeigt, dass mindestens ein Operand NaN ist). Eine solche   Ein Vergleich wird wie folgt durchgeführt:

     
  1. Aufruf von ToPrimitive (x, Hinweisnummer).

  2.   
  3. Aufruf von ToPrimitive (y, Hinweisnummer).

  4.   

3.Wenn Typ (Ergebnis (1)) Zeichenfolge und Typ (Ergebnis (2)) Zeichenfolge ist, fahren Sie mit Schritt 16 fort. (Beachten Sie, dass sich dieser Schritt von Schritt 7 im Algorithmus für unterscheidet   der Additionsoperator + in und anstelle von oder.)

     

4.Anrufnummer (Ergebnis (1)).

     

5.Call ToNumber (Ergebnis (2)).

     

...

Im Fall von "20a">10 muss die JavaScript-Engine ToNumber auf "20a" anwenden. . Der vollständige Algorithmus ist komplex, sagt aber Folgendes aus:

  

Wenn die Grammatik den String nicht als Erweiterung von interpretieren kann   StringNumericLiteral, dann ist das Ergebnis von ToNumber NaN.

Sie vergleichen also NaN mit 10 und jeder Vergleich mit NaN gibt false zurück (oder undefined , siehe Kommentare unten).

    
Denys Séguret 12.10.2012 09:00
quelle
0

Beachten Sie für den letzten Fall, dass auch "20a" < 10 false zurückgibt. Dies hebt die Auswertung von "20a" bei NaN während des Vergleichs hervor, da NaN im Vergleich zu jeder Zahl immer false zurückgibt.

    
Stouffi 12.10.2012 09:02
quelle

Tags und Links