JavaScript - 你可以重复使用Date()对象吗?

7

是否可以创建一个新的Date()对象来获取当前日期,然后在一段时间后重复使用同一个Date()对象来获取新的当前时间?

似乎每次想要获取当前日期/时间都必须创建一个新的Date对象。

在我的应用程序中,我想运行一个动画,并且对于每个动画帧,我都需要获取当前时间。因此,每个帧都创建一个新的Date对象(可能是1000多个帧?)只会增加内存使用量。

有关此问题的任何提示吗?


2
如果您正在创建一个新的Date对象,但随后丢弃了对旧对象的引用,则垃圾回收器将会处理它,并且内存使用量不会随时间增长。 - icktoofay
你的直觉是正确的,下面的答案有一些不错的选项。值得注意的是,在JavaScript中使用setTimeout()setInterval()进行动画更为常规,如果你只针对现代浏览器,你应该研究一下requestAnimationFrame。祝好运! - Jordan Running
4个回答

5
除非你将它们分开存储,否则你的日期对象会自动进行垃圾回收。此外,你可以在每次迭代中创建并存储当前日期到同一变量中,无需担心内存膨胀。
举个例子:
var current = new Date()
for (var idx = 0; idx <= frameCount; ++idx) {
    current = new Date();

      // Do processing...
}

在这种情况下,您不会使用更多的内存,因为旧日期在被覆盖后将被垃圾回收。

我认为在动画帧中使用 new Date() 的问题不是内存使用量的增加,而是在清理被丢弃的对象时会发生垃圾回收暂停/抖动,从而影响您的动画。 - jfunk

3

如果你实际上不需要日期,而是需要毫秒级的时间,请使用 Date.now(),这样你就不必创建一个 Date 对象。

var t = Date.now(); // 1318479105311

您可以使用以下代码在旧版浏览器中进行兼容:

if( !Date.now ) Date.now = function(){ return +(new Date); };

0
如果你使用的是现代浏览器,请调用
Date.now()

该函数返回一个包含时代时间的数字。

在JavaScript中,数字是原始类型,因此您不会创建任何新对象。但正如其他人所说,新对象并不是太大的问题。

如果您不需要年、月和日,并且满意于时代时间,则仍然可能对此方法感兴趣。我想,如果您真的想重用日期对象,可以使用从时代时间派生的值调用设置器,但我认为这种方法并没有带来任何好处。


0
现代浏览器有Date.now()方法,它返回纪元时间而不创建对象。IE自9版本以来就有了它。
我不确定这会带来多大的优势,因为创建对象非常便宜。正如@icktoofay指出的那样,如果你不保留旧日期,它们将被垃圾回收。
编辑:这里有一个关于两者的基准测试Date.now在Chrome中实际上是两倍快,但由于它在> 3mhz区域内,我认为这对于动画来说并不重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接