Gleichheitsvergleich zwischen Datum und Nummer funktioniert nicht

8

Laut dem ECMA-Skriptstandard sollte der folgende Code true zurückgeben, aber nicht:

%Vor%

Abschnitt 11.9.3 sagt:

  
  1. Wenn Type (x) entweder String oder Number und Type (y) ist Object, geben Sie das Ergebnis des Vergleichs x == ToPrimitive (y).
  2. zurück   

Dann sagt Abschnitt 8.12.8 , dass ToPrimitive das Ergebnis von valueOf zurücksendet. Methode. Das bedeutet, dass die letzte Zeile in meinem Beispiel wie folgt lauten sollte:

%Vor%

Was true tatsächlich zurückgibt.

Warum gibt der erste Fall true nicht zurück?

    
GetFree 01.07.2015, 19:53
quelle

2 Antworten

5

Wenn Sie sich die Spezifikation im Abschnitt 8.12.8 ansehen, finden Sie diesen Text in der Nähe von Ende des Abschnitts:

  

Wenn die [[DefaultValue]] interne Methode von O ohne Hinweis aufgerufen wird, verhält sie sich so, als wäre der Hinweis Number , , außer O ist ein Date -Objekt (siehe 15.9.6), in diesem Fall verhält es sich so, als wäre der Hinweis String .

(Betonung meiner)

Nun, in Schritt 8 / 9 des Der abstrakte Gleichheitsvergleichsalgorithmus [ 11.9.3 ] , ToPrimitive(x) und ToPrimitive(y) werden ohne hint -Parameter aufgerufen.

Das Fehlen dieses Parameters hint bedeutet zusammen mit dem obigen Text, dass die Methode ToPrimitive den Wert toString() für Datumsobjekte zurückgibt.

Wie Sie wahrscheinlich wissen, gibt (new Date()).toString() eine String-Repräsentation des Datums in amerikanischem Englisch zurück [ Quelle ] :
"Wed Jul 01 2015 22:08:41 GMT+0200 (W. Europe Daylight Time)"

Dass eine solche Saite nicht gleich 1436497200000 ist, sollte keine große Überraschung sein. ; -)

    
Cerbrus 01.07.2015, 20:10
quelle
0

ToPrimitive (A) versucht, sein Objektargument in einen primitiven Wert zu konvertieren, indem versucht wird, variierende Sequenzen von A.toString- und A.valueOf-Methoden auf A aufzurufen.

Wenn der Aufruf toString() erfolgreich ist, ruft er nicht valueOf() auf.

    
Nathan Wilson 01.07.2015 20:12
quelle