2011-10-13 104 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的區域中,我認爲這對於動畫並不重要。

相關問題