我开始学习 JavaScript。我请教了同事如何获取当前时间。
他告诉我可以使用以下代码:
> date = new Date()
> date.valueOf()
但大多数人都是这样做的:
> Date.now()
第二种方法更简单易懂。如果我想说服我的同事使用第二种方法,我应该如何向他解释这种差异?我开始学习 JavaScript。我请教了同事如何获取当前时间。
他告诉我可以使用以下代码:
> date = new Date()
> date.valueOf()
但大多数人都是这样做的:
> Date.now()
第二种方法更简单易懂。如果我想说服我的同事使用第二种方法,我应该如何向他解释这种差异?在JavaScript中获取当前时间有几种方法:
new Date()
创建一个代表当前日期/时间的Date
对象。new Date().valueOf()
返回自1970年1月1日UTC 00:00:00以来的毫秒数。new Date().getTime()
功能与new Date().valueOf()
相同。Date.now()
功能与上述两个方法相同。如评论和MDN链接所提到的,Date.now()
在Internet Explorer 8中不受支持。因此,如果需要IE 8兼容性,则应使用new Date().valueOf()
,但可能会降低代码可读性。
或者,如果您希望使用Date.now()
但必须与不支持它的浏览器兼容,可以将以下代码放置在JavaScript文件的某个位置中,以添加支持。
if (!Date.now) {
Date.now = function() {
return new Date().getTime();
}
}
由于我们不再关心IE8,因此只有两种方法是有意义的:
new Date()
- 创建一个代表当前日期/时间的Date
对象Date.now()
- 返回自1970年1月1日UTC 00:00:00以来经过的毫秒数(在旧版回答中提到的另外两种方法与Date.now()
在功能上等效,但看起来更丑并且适用于IE8。)
作为一种风格,我发现在处理时间间隔(通常是将较早日期减去较晚日期以计算流逝时间)的代码中使用Date.now()
更清晰,而在时间戳(例如写入数据库的时间戳)中使用new Date()
。
new Date().getTime()
,new Date().valueof()
和Date.now()
在功能上是等效的。然而,Date.now()
仅受支持于不同版本的浏览器中,最重要的是IE9。因此,如果需要支持IE9之前的版本,则可能需要使用polyfill。当我需要时间戳时,通常使用+new Date()
或+ new Date().toString(36)
。
最近我改用 Date.now()
,因为它更有效率,或将来会更有效率。
技术上,操作系统将日期时间报告为原始数据,通过调用 new Date()
,JavaScript引擎必须创建一个带有原型的对象(通过引用传递,并且稍后必须进行垃圾收集),然后再调用另一个valueOf
函数。
但是Date.now
可能是全局Date
对象的静态函数,它对从操作系统报告的值执行简单的数学运算。
我没有检查所有JavaScript引擎的源代码,以确保Date.now
不会创建日期实例,但它更有效率,或将来会更有效率。
编辑 我查看了quickjs和Date.now() 更加高效
new Date()
https://github.com/bellard/quickjs/blob/master/quickjs.c#L42079
Date.now() https://github.com/bellard/quickjs/blob/master/quickjs.c#L41996
(new Date()).valueOf()
来实现。 - DaigetTime()
的原因是为了与new Date("2020-11-22").getTime();
保持一致性,他们说得有道理。记住一个函数的默认/无参数版本比记住第二个函数要容易得多。 - MarkHu