自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
直覺上,兩個相同的日期之間比較應(yīng)該是相等的,然而結(jié)果并不是這樣。

 [[359213]]

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

 

  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 

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

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

 

  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 (中國標(biāo)準(zhǔn)時間) 
  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 年的毫秒數(shù), 1000 * 60 * 60 * 24 * 365 

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

數(shù)組排序的坑

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

 

  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] 

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

 

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

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

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

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

 

  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] 

下次碰到數(shù)組數(shù)組默認(rèn)排序出現(xiàn)這樣的結(jié)果你也就不感到奇怪了:

 

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

所以為了防止出現(xiàn) Bug,應(yīng)該傳入自定義排序函數(shù)。

責(zé)任編輯:華軒 來源: 1024譯站
相關(guān)推薦

2022-11-18 07:34:12

Docker項(xiàng)目目錄

2022-07-26 09:34:23

監(jiān)控系統(tǒng)

2021-12-28 08:17:41

循環(huán) forgo

2024-04-10 08:39:56

BigDecimal浮點(diǎn)數(shù)二進(jìn)制

2021-03-02 10:50:23

SpringMVC 參數(shù)JavaWeb

2023-11-18 18:36:17

defer語句延遲

2016-12-02 20:43:28

Android

2023-03-06 07:50:19

內(nèi)存回收Go

2018-01-26 09:01:16

對象存儲Java

2021-07-28 05:01:29

Lombok前端測試

2024-11-20 18:16:39

MyBatis批量操作數(shù)據(jù)庫

2023-01-18 23:20:25

編程開發(fā)

2020-09-15 08:46:26

Kubernetes探針服務(wù)端

2025-02-18 15:17:59

2015-06-08 11:21:42

iOS技巧

2010-09-02 17:31:42

VisualStudi微軟flash

2019-12-16 11:16:22

Git子模塊項(xiàng)目

2021-09-05 17:24:49

數(shù)字人民幣子錢包區(qū)塊鏈

2023-02-20 08:11:04

2017-05-05 08:12:51

Spark共享變量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號