成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

比較 JavaScript 日期對象也能踩坑?漲姿勢了

開發 前端
直覺上,兩個相同的日期之間比較應該是相等的,然而結果并不是這樣。

 [[359213]]

直覺上,兩個相同的日期之間比較應該是相等的,然而結果并不是這樣:

 

  1. const d1 = new Date('2019-06-01'); 
  2. const d2 = new Date('2018-06-01'); 
  3. const d3 = new Date('2019-06-01'); 
  4.  
  5.  
  6. d1 === d3; // false 
  7. d1 == d3; // false 

可以看到,無論用===還是==,結果都是false。細想也不奇怪,畢竟是兩個獨立的 JS 對象,并不是基本數據類型的變量。那該怎么判斷日期是否相等呢?

可以用toString()或者valueOf()。日期對象的toString()方法將日期轉成 ISO 日期字符串形式,而valueOf() 方法則將日期轉成毫秒數字形式的時間戳。

 

  1. const d1 = new Date('2019-06-01'); 
  2. const d2 = new Date('2018-06-01'); 
  3. const d3 = new Date('2019-06-01'); 
  4.  
  5.  
  6. // Sat Jun 01 2019 08:00:00 GMT+0800 (中國標準時間) 
  7. d1.toString(); 
  8. d1.valueOf(); // 1559347200000 
  9.  
  10.  
  11. d1.toString() === d2.toString(); // false 
  12. d1.toString() === d3.toString(); // true 
  13.  
  14.  
  15. d1.valueOf() === d2.valueOf(); // false 
  16. d1.valueOf() === d3.valueOf(); // true 

有意思的是,雖然== 和 === 不能用來比較日期對象,< 和> 卻可以:

 

  1. d1 < d2; // false 
  2. d1 < d3; // false 
  3.  
  4.  
  5. d2 < d1; // true 

因此,要判斷日期a是否在日期 b之前,只要判斷a < b是否為true。另外,日期之間還能用-操作符相減,返回毫秒差值。

 

  1. const d1 = new Date('2019-06-01'); 
  2. const d2 = new Date('2018-06-01'); 
  3. const d3 = new Date('2019-06-01'); 
  4.  
  5.  
  6. d1 - d3; // 0 
  7. d1 - d2; // 1 年的毫秒數, 1000 * 60 * 60 * 24 * 365 

也就是說,你可以用a - b 結果的正負來判斷兩個日期的先后。

數組排序的坑

日期對象數組排序的結果很可能出乎意料。比如下面這個排序:

 

  1. const d1 = new Date('2017-06-01'); 
  2. const d2 = new Date('2018-06-01'); 
  3. const d3 = new Date('2019-06-01'); 
  4.  
  5.  
  6. [d2, d1, d3].sort(); // [d2, d3, d1] 

按理說從小到大排序應該是[d1, d2, d3],結果很意外。這是為什么呢?原來,JavaScript 數組的sort方法默認是比較元素的字符串形式。因此,上面的sort實際上是基于下面的結果來排序的:

 

  1. 'Fri Jun 01 2018 08:00:00 GMT+0800 (中國標準時間)'
  2.   'Sat Jun 01 2019 08:00:00 GMT+0800 (中國標準時間)'
  3.   'Thu Jun 01 2017 08:00:00 GMT+0800 (中國標準時間)' ] 

怎么解決這個問題?很簡單,傳一個自定義的排序函數compare()給sort()方法。這個compare()函數的返回值確定了兩個元素的大小(先后順序):

  • 0 表示 a 和b 相等
  • 正值表示 a > b,也就是a在b后面
  • 負值表示 a < b,也就是a在b前面

由于 JavaScript 日期對象可以直接相減,那這個比較函數就很簡單了:

 

  1. const d1 = new Date('2017-06-01'); 
  2. const d2 = new Date('2018-06-01'); 
  3. const d3 = new Date('2019-06-01'); 
  4.  
  5.  
  6. [d2, d1, d3].sort((a, b) => a - b); // [d1, d2, d3] 

下次碰到數組數組默認排序出現這樣的結果你也就不感到奇怪了:

 

  1. const a = [1, 4, 3, 12]; 
  2. a.sort(); // [1, 12, 3, 4] 

所以為了防止出現 Bug,應該傳入自定義排序函數。

責任編輯:華軒 來源: 1024譯站
相關推薦

2022-11-18 07:34:12

Docker項目目錄

2022-07-26 09:34:23

監控系統

2021-12-28 08:17:41

循環 forgo

2024-04-10 08:39:56

BigDecimal浮點數二進制

2021-03-02 10:50:23

SpringMVC 參數JavaWeb

2023-11-18 18:36:17

defer語句延遲

2016-12-02 20:43:28

Android

2023-03-06 07:50:19

內存回收Go

2018-01-26 09:01:16

對象存儲Java

2021-07-28 05:01:29

Lombok前端測試

2024-11-20 18:16:39

MyBatis批量操作數據庫

2023-01-18 23:20:25

編程開發

2025-02-18 15:17:59

2020-09-15 08:46:26

Kubernetes探針服務端

2010-09-02 17:31:42

VisualStudi微軟flash

2015-06-08 11:21:42

iOS技巧

2021-09-05 17:24:49

數字人民幣子錢包區塊鏈

2022-12-18 22:11:46

2019-12-16 11:16:22

Git子模塊項目

2023-02-20 08:11:04

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频在线看 | 国产婷婷色综合av蜜臀av | 高清视频一区二区三区 | 成人不卡| 夜色www国产精品资源站 | 一区免费 | 国产不卡视频在线 | 日韩欧美国产一区二区三区 | 在线免费观看黄a | 99亚洲精品 | 午夜精品一区二区三区在线观看 | 亚洲国产精品久久人人爱 | 福利视频网址 | 成人午夜视频在线观看 | 91精品观看 | 欧洲一级毛片 | 色婷婷精品久久二区二区蜜臂av | 一区二区三区四区视频 | 免费成人高清在线视频 | 久久精品网 | 国产亚洲精品精品国产亚洲综合 | 在线91 | 欧美一级欧美三级在线观看 | 成人h视频在线 | 久久高清 | 精品国模一区二区三区欧美 | 波多野结衣先锋影音 | 日韩视频 中文字幕 | 日本精品一区二区三区在线观看视频 | 中文精品久久 | 真人女人一级毛片免费播放 | 亚洲免费视频在线观看 | 亚洲福利 | 欧美在线一区视频 | 国产精品欧美一区二区三区 | 日本在线免费看最新的电影 | 一区二区中文 | 欧美一区二区三区视频在线观看 | 天天干视频网 | 亚洲视频第一页 | 黄色国产在线播放 |