+新的date() – 这是好的做法吗?

所以我们今天在我们公司讨论了+new Date()是不是好的做法。 一些人喜欢这种方式通过new Date().getTime()

在我看来,这是相当方便的,但另一方面,人们会说很难阅读。

除了明显的“不熟悉一元运算符的人更难理解”之外,还有什么优点或缺点?

getTime方法看起来速度更快 :

在这里输入图像说明

这是为什么?

以下是在Date实例上调用getTime方法时发生的情况:

  1. 返回此Date对象的[[PrimitiveValue]]内部属性的值。

以下是将一元加号运算符应用于Date实例时会发生的情况:

  1. 获取有问题的Date实例的值
  2. 将其转换为数字
    1. 将其转换为一个基元
      1. 调用内部[[DefaultValue]]方法

在过去的几年中,我经过了这么多的思考后,得出结论:这里的performance不是一个因素。

所以这里是我喜欢的可读性的解决scheme:

Date.now();

我发现这种types的代码往往不经常被调用,所以我认为最好为通常看到的内联用法添加testing:

例如

 var t = (new Date()).getTime(); 

 var t = +new Date(); 

JSPerf结果显示,这两者在速度上没有太大的区别: http ://jsperf.com/get-time-vs-unary-plus/7

在这里输入图像说明

以前的性能testing结果的问题是这个例子不实用。 now在实践中你不会一直保持不变。 如果现在没有改变,你只需要存储一次getTime()结果。 正如这些新的结果所显示的那样,在典型的使用情况下,速度差异并不显着。

所以我想一般的build议是,使用一次性使用+new Date()较短,但(new Date()).getTime()更可读(和点点儿更快)。

Date.now():

如果您要使用较新的Date.now() ,您将需要实现推荐的Shim以从此处支持较旧的浏览器

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

(虽然我很困惑,为什么他们不只是在这个例子中使用匿名函数)

这一切都取决于你在比较什么。

实际上,在同一个date对象上连续运行.getTime的次数与读取一个固定variables的次数差不多一百万次,这似乎并不影响任何实际的代码。

更有趣的testing可能会比较每个迭代中从新date返回时间string所花费的时间。

 <!doctype html> <html lang="en"> <head> <meta charset= "utf-8"> <title>get time</title> <script> /*does n= +new Date() take longer than n= new Date().getTime()?*/ var score=[],runs; function tests(arg){ runs= parseInt(document.getElementsByTagName('input')[0].value)|| 100000; var A= [], i= runs, start= new Date(),n=1357834972984; while(i--){ A.push(n); } if(arg!==true){ score[0]= (new Date()- start); setTimeout(tests0, 0); } } function tests0(){ runs= parseInt(document.getElementsByTagName('input')[0].value)|| 100000; var A= [], i= runs, start= new Date(); while(i--){ A.push(+(start)); } score[1]= (new Date()- start); setTimeout(tests1, 0); } function tests1(){ var A= [], i= runs, start= new Date(); while(i--){ A.push(start.getTime()); } score[2]= (new Date()- start); setTimeout(tests2, 0); } function tests2(){ var A= [], i= runs, start= new Date(); while(i--){ A.push(+(new Date)); } score[3]= (new Date()- start); setTimeout(tests3, 0); } function tests3(){ var A= [], i= runs, start= new Date(); while(i--){ A.push(new Date().getTime()) } score[4]= (new Date()- start); setTimeout(report, 0); } function report(){ var inp=document.getElementsByTagName('input'),t, lab=document.getElementsByTagName('label') for(var i=0;i<5;i++){ inp[i+1].value=score[i]+' msec'; } } onload= function(){ tests(true); document.getElementsByTagName('button')[0].onclick=tests; } </script> </head> <body> <h1>Comparing +prefix and getTime()</h1> <p> This comparison builds an array of the values for each test case, eg, 100000 array items for each case. </p> <ol> <li>Building an array of a fixed integer, no date calculations at all.</li> <li>Reading +prefix of existing Date and adding each value to array.</li> <li>Reading getTime from existing Date and adding each value to array.</li> <li>Creating a new date with +(new Date) and adding each value to array.</li> <li>Creating a new date with new Date().getTime()and adding each value to array.</li> </ol> <p><label>Iterations of each test:<input type="text" size="8" value="100000"></label> <button type="button">Run Tests</button></p> <p><label>1. Building the array with no calculation: <input type="text" size="12"></label></p> <h2>Repeatedly reading the same created date</h2> <p><label>2. +prefix to existing Date: <input type="text" size="12"></label></p> <p><label>3. getTime from existing Date: <input type="text" size="12"></label></p> <h2>Creating a new date and reading new value each time:</h2> <p><label>4. +(new Date): <input type="text" size="12"></label></p> <p><label>5. new Date().getTime(): <input type="text" size="12"></label></p> </body> </html> 

恕我直言,当没有太多的差异性,易读性应该总是胜出。 我们都应该练习WCTR“写代码来阅读”。 所以,对我来说,这是最好的做法:

 (new Date()).getTime();