Laut dem ECMA-Skriptstandard sollte der folgende Code true zurückgeben, aber nicht:
%Vor%Abschnitt 11.9.3 sagt:
- Wenn Type (x) entweder String oder Number und Type (y) ist Object, geben Sie das Ergebnis des Vergleichs x == ToPrimitive (y).
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:
Was true
tatsächlich zurückgibt.
Warum gibt der erste Fall true
nicht zurück?
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 vonO
ohne Hinweis aufgerufen wird, verhält sie sich so, als wäre der HinweisNumber
, , außerO
ist einDate
-Objekt (siehe 15.9.6), in diesem Fall verhält es sich so, als wäre der HinweisString
.
(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. ; -)
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.
Tags und Links javascript comparison date-comparison value-of type-coercion