問題
做一個節日提示網頁,首先獲得當前日期,然后與最近的節日比較,如果恰好是同一天,提示“XX節快樂!”否則,提示“離XX節還有X天”。判斷是否恰好同一天的時候我用了類似如下代碼:
var today=new Date();
var valentine=new Date(today.getFullYear(),1,14);
if(today==valentine){
alert("情人節快樂!");
}else if{
...
}
調試時,我為了能測到恰好是情人節的情況,又特意把today改成情人節了:
var today=new Date(2015,1,14);
結果沒有執行到alert部分,控制台監視以后發現,today==valentine部分,返回的是false,自然就跳過了。
解決
用如下方式都可判斷兩日期是否相等:
第一種:
if(date1.getTime()==date2.getTime()){
...
}
第二種:
if(date1-date2==0){
...
}
說明
1.為什么”==“判斷返回false?
日期對象是引用類型,而非值類型。
引用類型與值類型的區別在於:
值類型的變量:值就保存在棧內存中,訪問變量時操作的就是實際的數據值。
引用類型的變量:變量只是保存了一個引用或者說是指針,這個引用或指針指向一個堆內存中的位置,這個位置才是保存了真正的數據值。訪問引用性變量時,先從棧中取得這個內存位置,然后找到數據值。
所以用“==”比較today和valentine時,比較的不是兩個數據值,而是兩個不同的引用,這兩個引用分別指向兩個不同位置的對象,所以返回false。
2.getTime()用法
表示時間距1970年1月1日午夜之間的毫秒數,返回一個整數值,所以可直接比較。
3.date1-date2
返回兩個日期相差的毫秒數。
4.getMonth()需要注意的地方
從0開始,即0,1,2...對應的分別是一月,二月,三月........。