2010-05-22 180 views
11

爲什麼等號運算符在第一種情況下返回false?JavaScript日期比較

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 

爲什麼?

回答

28

由於日期的內置對象,而不是primitives,則使用對象引用完成相等性檢查。

在這種情況下,對象ab不是同一個對象,因此測試失敗。
可以使用

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

通過使用.getTime.valueOf你的對象值轉換爲原始看到相同的,而這些始終由價值,而不是按引用進行比較。

如果你想通過兩個日期的價值做比較也有一個比較模糊的方式來做到這一點

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

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

在這種情況下,一元+運營商強制JavaScript引擎調用對象valueOf方法 - 所以這是兩個正在比較的基元。

+0

這是一個有趣的黑客,謝謝! – Art 2010-05-23 01:40:32

+0

不確定我真的稱它爲黑客。 – 2010-05-23 13:25:31

+0

只是爲了確保 - 我指的是「+ a == + b」聲明。 – Art 2010-05-31 04:36:56

0

Compare two dates with JavaScript

dates.compare(A,B)

事實是,兩個對象之間的比較不能正常工作:/

+0

不是。兩個對象之間的比較按指定進行。 – 2010-05-22 18:53:00

0

如果您創建兩個時鐘,並將它們都設置爲同一時間,那麼您有兩個時鐘。

如果您改變一個時鐘的時間,它不會改變另一個時鐘的時間。

要比較或排序日期,從一個減去另一個。 在數學表達式中使用的Date對象的值是其時間戳。

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

-1

我很抱歉,但這是愚蠢的...尤其是有兩個鍾。

==,按定義比較VALUES,而===比較參考。說==對於非原語失敗會破壞語言自己的語法結構。當然,===在最初的例子中會失敗,因爲這兩個日期顯然是指向兩個不同的內存空間的兩個不同的指針,但是通過JS規範的定義,==應該返回TRUE來比較兩個日期的價值是相同的時間點。

還有一個原因,我恨JS ...

對不起咆哮,但這只是踢我的屁股了一個小時。另外,你可以使用valueOf()來強制比較這些值,這將返回true ...它與==是多餘的,但它的工作原理。

+0

同意之前檢查每個日期的空值,這樣的WTF – Art 2010-11-13 03:33:20

+1

您不知道您在咆哮什麼... ==和===之間的區別==與value和refs沒有關係,==簡單地說,當兩個操作數是不同類型時,VM應該使用一組明確定義的強制規則,而===則表示不會出現這種強制。 – 2011-05-19 10:19:48