Date.now()、new Date().getTime()与+new Date的区别及原理咨询
1. Date.getTime() 的存在意义
Date.now() 和 getTime() 看似返回结果一致,实际定位完全不同:
Date.now()是ES5才新增的静态方法,仅能获取代码执行时刻的当前时间戳,能力边界非常有限。getTime()是Date实例的原型方法,核心作用是获取任意已创建的Date实例对应的时间戳,而非仅能获取当前时间。比如你构造了一个历史时间的Date对象const birthday = new Date('1999-10-01'),要获取这个日期对应的时间戳,只能调用birthday.getTime(),Date.now()完全无法满足这类需求。- 另外还有历史兼容性原因:ES5发布前没有
Date.now()方法,所有获取时间戳的需求都依赖new Date().getTime()实现,在需要兼容IE8及更早版本的场景下,getTime()依然是唯一可靠的选择。
2. +new Date 的运行原理
这个写法的效果和new Date().getTime()完全一致,背后是两个JS基础规则共同作用的结果:
- 首先,构造函数调用时如果不需要传参,括号可以省略,
new Date和new Date()是完全等价的,都会返回一个当前时间的Date实例。 - 其次,一元正号运算符
+作用于对象时,会触发JS的ToNumber类型转换逻辑:优先调用对象的valueOf()方法,如果返回原始类型值,就直接将该值转为数字作为结果;如果valueOf()返回的还是对象,才会调用toString()方法再做转换。 - 而Date对象的
valueOf()方法的返回值,本身就是和getTime()完全相同的毫秒级时间戳数值,属于原始类型,所以转换后直接就得到了时间戳结果。
类似new Date() * 1、Number(new Date())这类写法,本质上都是触发了Date的valueOf()逻辑,和+new Date原理一致。
内容的提问来源于stack exchange,提问作者user16238654
相关产品推荐
相关产品推荐

