2014-05-01 11 views
5

In einem Mathe-Unterricht vor langer Zeit war ich, dassWarum sind Javascript-Vergleichsoperatoren mathematisch inkonsistent?

a == b , wenn und nur wenn ein < = b und b gelehrt < = a.

Javascript scheint nicht so zu denken:

> new Date(400) <= new Date(400) 
true 
> new Date(400) >= new Date(400) 
true 
> new Date(400) == new Date(400) 
false 

Kann jemand die Art Zwang Regeln erklären, die zu diesem Ergebnis führen? Es scheint, dass der Fuzzy-Operator == davon überzeugt sein sollte, dass die beiden Date s gleiche Werte haben.

+3

Zwei Daten sind zwei verschiedene Objekte, Mathematik gilt nicht, speziell nicht in Operatoren, verwechseln sie nicht, sie haben unterschiedliche Regeln. Das Datum wird in einigen Fällen mit Zeichenfolgen versehen. – elclanrs

Antwort

3

Zunächst beginnen wir mit dem, was Sie vergleichen:

typeof new Date(400) 
"object" 

Javascript-Objekte verwenden die Methode .valueOf(), um die Werte in den ersten beiden Fällen zu vergleichen. Allgemeine Objekte können nicht standardmäßig miteinander verglichen werden und verwenden die Zeichenfolge "[Objekt Objekt]". Daten auf der anderen Seite wissen, wie.

new Date(400) <= new Date(400) 
new Date(400).valueOf() <= new Date(400).valueOf() 
400 <= 400 
true 

jedoch die letzte Operation für Objekte unterschiedlich definiert wird, vergleicht es, wenn die beiden Objekte (nicht die ganzen Zahlen wie oben) haben die gleiche Referenz, die sie nicht als beide separat neue Objekte erstellt werden .

new Date(400) == new Date(400) 
false 

Wenn Sie die Datumswerte in ähnlicher Weise wie die ersten beiden vergleichen wollen, müssen Sie stattdessen speziell .valueOf() nennen.

new Date(400).valueOf() == new Date(400).valueOf() 
true 
+0

Ihre Argumentation scheint nicht korrekt zu sein, nämlich: 'new Date (400)> = new Date (401)': 'false'. –

+1

@AndrewMao Danke, ich schrieb die Antwort von meinem Kopf, überprüfte es jetzt und fand, wo ich mich geirrt hatte. – Nit

1

Mozillas documentation für Vergleichsoperatoren in Javascript bestätigen die Nit Aussage über == wie für Variablen vom Typ Object definiert.

Wenn beide Operanden Objekte sind, dann vergleicht JavaScript interne Referenzen, die gleich sind, wenn Operanden zu dem gleichen Objekt in Speicher verweisen.

Dieser spezielle Hinweis ist nur für die Operatoren == und !=. Dies bedeutet, dass für die Operatoren >= und <= die Objekte selbst verglichen werden und nicht die internen Referenzen.

Die natürliche Frage ist: Wie ist der Vergleich (<, <=, >, >=) für zwei Date Objekte definiert? Ich konnte keine Referenzen dafür finden, also denke ich, dass wir uns vielleicht einen Quellcode ansehen müssen, um diese Frage zu beantworten.

Verwandte Themen