2011-10-13 70 views
4

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

看来您必须在每次需要当前日期/时间时创建一个新的Date对象。

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

这一个的任何线索?

+2

如果您正在创建一个新的Date对象,但随后将引用删除,那么垃圾收集器将获得它,并且内存使用量不会随着时间增长。 – icktoofay

+0

你的直觉是对的,下面的答案有一些很好的选择。但值得注意的是,对于动画来说,使用['setTimeout()'或'setInterval()'](http://www.schillmania.com/content/projects/javascript-animation-1/)更传统JavaScript,如果你只针对现代浏览器,你应该看看['requestAnimationFrame'](https://developer.mozilla.org/en/DOM/window.mozRequestAnimationFrame#AutoCompatibilityTable)。祝你好运! –

回答

3

除非您单独存储它们,否则您的日期对象会自动进行垃圾回收。此外,您可以创建将当前日期存储到同一个变量,而不必担心内存溢出。

例如:

var current = new Date() 
for (var idx = 0; idx <= frameCount; ++idx) { 
    current = new Date(); 

     // Do processing... 
} 

你不会在这种情况下使用越来越多的内存,因为它已被覆盖后,旧的日期将是垃圾收集。

+0

啊,现在有道理。谢谢 –

+0

我认为动画帧中'new Date()'的问题并不是内存使用盛行,而是垃圾收集会在您的动画期间发生暂停/抖动,同时清理丢弃的对象。 – jfunk

0

如果你有一个现代的浏览器,调用

Date.now() 

返回包含了划时代的时间数。

数字是JavaScript中的基元,因此您不会创建任何新对象。但正如其他人所说的那样,新的对象并不是什么大事。

不过你可能会对这种方法感兴趣,特别是如果你不需要年,月,日,并且会满足时代的要求。我想,如果你真的想要想要重用一个日期对象,你可以调用setters来从时代衍生出来的值,但是我不认为这种方法会为你购买任何东西。

2

如果您实际上不想要日期,而是以毫秒为单位的时间,请使用Date.now(),因此您不必创建Date对象。

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

你可以用垫片成旧的浏览器:

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

现代浏览器有Date.now()方法,该方法返回 时代 时间,而无需创建一个对象。 IE从版本9开始。

我不确定这会带来很多好处,但创建一个对象相当便宜。正如@icktoofay指出的那样,如果你不保留旧日期,他们将被垃圾收集。编号:here's a benchmark on bothDate.now实际上是Chrome的两倍,但是在> 3mhz的区域中,我认为这对于动画并不重要。

相关问题