Ответ 1
Подумав об этом в последние годы, я пришел к выводу, что производительность здесь не является фактором.
Итак, вот решение, которое я предпочитаю с точки зрения удобочитаемости:
Date.now();
Итак, у нас была дискуссия сегодня в нашей компании о +new Date()
хорошей практике или нет.
Некоторые предпочитают этот путь через new Date().getTime()
.
По-моему, это довольно удобно, но с другой стороны можно сказать, что это труднее читать.
Есть ли какие-либо плюсы или минусы, кроме очевидного "Это труднее понять для людей, не знакомых с унарным оператором"?
Подумав об этом в последние годы, я пришел к выводу, что производительность здесь не является фактором.
Итак, вот решение, которое я предпочитаю с точки зрения удобочитаемости:
Date.now();
Метод getTime
представляет собой огромное количество быстрее:
Почему это так?
Здесь, что происходит, когда вы вызываете метод getTime
на экземпляр Date
:
[[PrimitiveValue]]
этого объекта Date.Вот что происходит, когда вы применяете оператор унарного плюса к экземпляру Date
:
Date
[[DefaultValue]]
Я нахожу, что этот тип кода часто называют нечасто, поэтому я подумал, что лучше всего добавить тесты для встроенного использования, которое вы обычно видите:
например.
var t = (new Date()).getTime();
и
var t = +new Date();
Результаты JSPerf показывают, что эти два не сильно отличаются по скорости: http://jsperf.com/get-time-vs-unary-plus/7
Проблема с предыдущими первыми результатами заключается в том, что пример не является практическим. На практике вы бы не стали тем же самым now
. Вы просто сохранили бы результат getTime()
один раз, если теперь он не изменился. Как показывают эти новые результаты, разница в скорости не является существенной в типичной ситуации использования.
Итак, я думаю, что общий совет: использовать для однократного использования +new Date()
короче, но (new Date()).getTime()
более читабельно (и чуть быстрее).
Если вы собираетесь использовать новый Date.now()
, вы захотите реализовать рекомендуемую прокладку для поддержки старых браузеров из здесь
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
(Хотя я озадачен, почему они не просто используют анонимную функцию в этом примере)
Все зависит от того, что вы сравниваете.
Фактически, запуск .getTime миллион раз подряд в одном объекте даты примерно так же быстро, как чтение фиксированной переменной миллион раз, что не кажется первичным для какого-либо реального кода.
Более интересный тест может сравнить время, необходимое для возврата строки времени из новых дат на каждой итерации.
<!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();