多得是,你不知道的关于 Date 类的事情

203 阅读3分钟

咱们一起聊聊 Date 类型的一些问题。 正常情况的 Date 使用,相信小伙伴们都已经烂熟于心了。如果还不会的,可以自行面壁十分钟😀,然后去 Date - JavaScript | MDN (mozilla.org) 看看这位老朋友,温故知新一下。

Date 类构造时,以下参数传入是无效的,会返回 Invalid Date

new Date('')         // Invalid Date
new Date(NaN)        // Invalid Date
new Date(undefined)  // Invalid Date 因为 undefined 强转 number 类型时,会返回 NaN
new Date([])         // Invalid Date 
new Date({})         // Invalid Date
new Date(() => {})   // Invalid Date

number 类型

当传递 number 类型的参数时,会被当做时间戳,即从1970年1月1号0时0分0秒0毫秒开始,到当前数字的时间间隔。

new Date(1000)
// Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)
new Date(1000).getTime()
// 1000

null 类型

当传递 null 类型参数时,直接当做数字 0 对待。

new Date(null)
// Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)

Symbol (符号)类型

当传递 Symbol 类型参数时,则会直接报错,因为无法将此类型参数转为 number 类型。

new Date(Symbol('hello'))
// VM2084:1 Uncaught TypeError: Cannot convert a Symbol value to a number
//    at new Date (<anonymous>)
//    at <anonymous>:1:1

布尔类型

当传递 boolean 类型的参数时,true 会被直接转为 number 类型的 1false 被转为 number 类型的 0,然后当做时间戳对待。

new Date(true)
// Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
new Date(true).getTime()
// 1
new Date(false)
// Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)
new Date(false).getTime()
// 0

数组类型

对于数组类型来说会有点特别,一开始我们已经看到了,当传入空数组时候,会返回 Invalid Date 。但是当数组由数字组成时候,无论是 string 类型,还是 number 类型,或者是数字和字符串数字混合的,可以正常创建 Date 对象,但是返回值却值得玩味。

当数组中按照年月日,或者月日年格式排列参数时,会返回对应值得 Date 对象,测试下来,应该支持这两种格式的数组值,如果数组元素超过4个,基本都会返回 Invalid Date 。如下所示:

new Date([2022, 1, 10])
// Mon Jan 10 2022 00:00:00 GMT+0800 (中国标准时间)
new Date([1, 10, 2022])
// Mon Jan 10 2022 00:00:00 GMT+0800 (中国标准时间)
new Date(['1', '10', '2022'])
// Mon Jan 10 2022 00:00:00 GMT+0800 (中国标准时间)

当数组参数小于3个时候,部分可以返回 Date 对象,但是结果却不一定是我们想要的。例如:

new Date([0.0000001])
// Invalid Date

一般 object 类型

普通的对象类型,一开始已经给出结果了,返回 Invalid Date 。但是,好奇的我,还是尝试了一下非空对象的情况,像下面这样,如下:

new Date({'year': 2022, 'month': 1, 'day': 1})
// Invalid Date

总结

目前测试下来,符合日期格式的参数,无论是数字类型,还是字符串,或者是数组,Date 对象都是能正常返回,至于其他类型的参数,大家在使用的时候就要小心,尤其在使用一些第三方的日期处理库,像 momentdayjs 等。