+(new Date()) vs. Date.now()

Zufällig hing ich kürzlich in #meteor (auf Freenode) rum, als jemand eine Frage angesprochen hat, die ich mir auch schon gestellt habe: Wo liegen genau die Unterschiede zwischen den Javascript-Anweisungen +(new Date()) und Date.now()?

Image

Wahrscheinlich genauso aus Zufall war eines der ersten Dinge, die ich bezüglich der Programmierung in Javascript gelernt hab, dass man besser die Date.now() Variante benutzt, weil die nicht erst ein Objekt erstellt, sondern sofort die Anzahl der vergangenen Millisekunden seit Anbeginn der Zeit zurück gibt (Nerd-Talk für den 1. Januar 1970).

Dementsprechend ist “Date.now()” wesentlich schneller als “new Date()”, in Firefox 15 auf meinem System zum Beispiel um den Faktor 5 (hier eigenen Browser messen).

Das unäre “+” in “+(new Date())” stellt lediglich sicher, dass das Date-Objekt als Zahl interpretiert wird (etwa wie in ToNumber(GetValue(new Date())), siehe ECMA Script Spezifikation, S. 84).

Warum aber setzt dann überhaupt jemand “new Date()” ein?

TomWij hat mich aufgeklärt: Date.now() funktioniert nicht in allen Browsern, insbesondere nicht im Internet Explorer vor Version 9. Auf dem Server (in Node.js) kann man es also bedenkenlos verwenden. Auf der Client-Seite jedoch nicht.

Gut zu wissen!

mforo> Hi guys. Why is +(new Date) used instead of new Date() in meteor code? any reason i should do it like that too?<br />
fsfsfs> + is a way of making sure this is cast to "integer" (lol) I guess<br />
fsfsfs> why don't they use Date.now() instead?<br />
fsfsfs> Date.now() doesn't create an object, and is faster by like 5 times when I tested using FF 15<br />
fsfsfs> https://jsperf.com/date-now-vs-new-date<br />
fsfsfs> I'd be interested if there are other differences I didn't get.<br />
tomwij> fsfsfs: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/now<br />
tomwij> See Compatibility, I'm willing to believe they are using that syntax just for the sake of backwards compatibility.<br />
tomwij> And probably performance isn't so big of a deal, assuming these calls are on the client. If they were on the server, it'd be a differente story...<br />
tomwij> (It be more nice if they introduced shims and not rely on such syntax)<br />
mforo> Im talking about server calls. Mainly for adding datestamps on new inserts.<br />
mforo> i've seen the +(new Date) way used in meteor packages, accounts mainly. That's why i wonder.<br />
fsfsfs> woa, IE >=9<br />
fsfsfs> k<br />
fsfsfs> Well, one can use it on the server.<br />