您好,登錄后才能下訂單哦!
本篇文章為大家展示了比較JavaScript日期對象時踩的坑是怎樣的,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
直覺上,兩個相同的日期之間比較應該是相等的,然而結果并不是這樣:
const d1 = new Date('2019-06-01'); const d2 = new Date('2018-06-01'); const d3 = new Date('2019-06-01'); d1 === d3; // false d1 == d3; // false
可以看到,無論用===還是==,結果都是false。細想也不奇怪,畢竟是兩個獨立的 JS 對象,并不是基本數據類型的變量。那該怎么判斷日期是否相等呢?
可以用toString()或者valueOf()。日期對象的toString()方法將日期轉成 ISO 日期字符串形式,而valueOf() 方法則將日期轉成毫秒數字形式的時間戳。
const d1 = new Date('2019-06-01'); const d2 = new Date('2018-06-01'); const d3 = new Date('2019-06-01'); // Sat Jun 01 2019 08:00:00 GMT+0800 (中國標準時間) d1.toString(); d1.valueOf(); // 1559347200000 d1.toString() === d2.toString(); // false d1.toString() === d3.toString(); // true d1.valueOf() === d2.valueOf(); // false d1.valueOf() === d3.valueOf(); // true
有意思的是,雖然== 和 === 不能用來比較日期對象,< 和> 卻可以:
d1 < d2; // false d1 < d3; // false d2 < d1; // true
因此,要判斷日期a是否在日期 b之前,只要判斷a < b是否為true。另外,日期之間還能用-操作符相減,返回毫秒差值。
const d1 = new Date('2019-06-01'); const d2 = new Date('2018-06-01'); const d3 = new Date('2019-06-01'); d1 - d3; // 0 d1 - d2; // 1 年的毫秒數, 1000 * 60 * 60 * 24 * 365
也就是說,你可以用a - b 結果的正負來判斷兩個日期的先后。
數組排序的坑
日期對象數組排序的結果很可能出乎意料。比如下面這個排序:
const d1 = new Date('2017-06-01'); const d2 = new Date('2018-06-01'); const d3 = new Date('2019-06-01'); [d2, d1, d3].sort(); // [d2, d3, d1]
按理說從小到大排序應該是[d1, d2, d3],結果很意外。這是為什么呢?原來,JavaScript 數組的sort方法默認是比較元素的字符串形式。因此,上面的sort實際上是基于下面的結果來排序的:
[ 'Fri Jun 01 2018 08:00:00 GMT+0800 (中國標準時間)', 'Sat Jun 01 2019 08:00:00 GMT+0800 (中國標準時間)', 'Thu Jun 01 2017 08:00:00 GMT+0800 (中國標準時間)' ]
怎么解決這個問題?很簡單,傳一個自定義的排序函數compare()給sort()方法。這個compare()函數的返回值確定了兩個元素的大小(先后順序):
0 表示 a 和b 相等
正值表示 a > b,也就是a在b后面
負值表示 a < b,也就是a在b前面
由于 JavaScript 日期對象可以直接相減,那這個比較函數就很簡單了:
const d1 = new Date('2017-06-01'); const d2 = new Date('2018-06-01'); const d3 = new Date('2019-06-01'); [d2, d1, d3].sort((a, b) => a - b); // [d1, d2, d3]
下次碰到數組數組默認排序出現這樣的結果你也就不感到奇怪了:
const a = [1, 4, 3, 12]; a.sort(); // [1, 12, 3, 4]
所以為了防止出現 Bug,應該傳入自定義排序函數。
上述內容就是比較JavaScript日期對象時踩的坑是怎樣的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。