2010-05-22 8 views
11

Warum gibt der Gleichheitsoperator im ersten Fall false zurück?JavaScript-Datumsvergleich

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 
alert(a == b); // <- returns false 
alert(a.getTime() == b.getTime()); // returns true 

Warum?

Antwort

28

Da Daten-Objekte werden in integrierten und nicht primitives, eine Gleichheitsprüfung erfolgt mit den Objektreferenzen.

In diesem Fall sind die Objekte a und b nicht das gleiche Objekt und der Test schlägt fehl.
Sie können das gleiche sehen

var a = new String("a"); 
var b = new String("a"); 
alert(a == b); //false 

Durch die Verwendung von .getTime oder .valueOf Sie konvertieren die Objekte Wert in eine primitive verwenden, und diese werden durch Wert immer im Vergleich eher als Bezug genommen wird.

Wenn Sie einen Vergleich nach dem Wert der beiden Daten gibt es auch ein Unbekannter Weg machen wollen diese

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 

alert(+a == +b); //true 

In diesem Fall zu tun zwingt die einstellige + Bediener die JavaScript-Engine die Objekte valueOf Methode aufrufen - und so werden zwei Primitive verglichen.

+0

Dies ist ein interessanter Hack, danke! – Art

+0

Nicht sicher, ich würde es wirklich einen Hack nennen. –

+0

Nur um sicher zu gehen - ich bezog mich auf "+ a == + b" Aussage. – Art

0

Compare two dates with JavaScript

dates.compare (a, b)

Tatsache ist, dass der Vergleich zwischen den beiden Objekten nicht richtig funktioniert:/

+0

Nicht wirklich. Der Vergleich zwischen zwei Objekten funktioniert wie angegeben. –

0

Wenn Sie zwei Uhren erstellen und beide auf die gleiche Zeit einstellen, haben Sie zwei Uhren.

Wenn Sie die Zeit in einer Uhr ändern, wird die Zeit in der anderen Uhr nicht geändert.

Um Daten zu vergleichen oder zu sortieren, subtrahieren Sie eine von der anderen. Der Wert eines Date-Objekts, das in einem mathematischen Ausdruck verwendet wird, ist sein Timestamp.

Funktion compareDates (a, b) {return a-b};

-1

Es tut mir leid Jungs, aber das ist idiotisch ... vor allem das bisschen über zwei Uhren.

==, vergleicht per Definition VALUES, während === Referenzen vergleicht. Zu sagen, dass == für Nicht-Primitive fehlschlägt, bricht die syntaktische Struktur der Sprache. Natürlich würde == im ersten Beispiel fehlschlagen, da die beiden Daten eindeutig zwei verschiedene Zeiger auf zwei unterschiedliche Speicherbereiche sind, aber genau nach der Definition der JS-Spezifikation sollte == für den Vergleich von zwei TRUE ergeben Daten, deren Wert der gleiche Zeitpunkt ist. mein Hintern für eine Stunde

Noch ein weiterer Grund, warum ich JS hassen ...

Sorry schimpfen, aber das trat gerade.

Nebenbei können Sie valueOf() verwenden, um den Vergleich der Werte zu erzwingen, und das wird True zurückgeben ... es ist redundant mit ==, aber es funktioniert.

+0

vereinbart, so ein WTF – Art

+1

Sie wissen nicht, worüber Sie schimpfen ... Die Unterscheidung zwischen == und === hat nichts mit Werten vs refs zu tun, == sagt einfach, dass die VM eine Reihe von klar definierten Zwangsregeln verwenden sollte, wenn die beiden Operanden von unterschiedlicher Art sind, während === besagt, dass keine solche Zwangs auftreten soll. –