Подтвердить что ты не робот

#ИМЯ?

Итак, у нас была дискуссия сегодня в нашей компании о +new Date() хорошей практике или нет. Некоторые предпочитают этот путь через new Date().getTime().

По-моему, это довольно удобно, но с другой стороны можно сказать, что это труднее читать.

Есть ли какие-либо плюсы или минусы, кроме очевидного "Это труднее понять для людей, не знакомых с унарным оператором"?

4b9b3361

Ответ 1

Подумав об этом в последние годы, я пришел к выводу, что производительность здесь не является фактором.

Итак, вот решение, которое я предпочитаю с точки зрения удобочитаемости:

Date.now();

Ответ 2

Метод getTime представляет собой огромное количество быстрее:

enter image description here

Почему это так?

Здесь, что происходит, когда вы вызываете метод getTime на экземпляр Date:

  • Возвращает значение внутреннего свойства [[PrimitiveValue]] этого объекта Date.

Вот что происходит, когда вы применяете оператор унарного плюса к экземпляру Date:

Ответ 3

Я нахожу, что этот тип кода часто называют нечасто, поэтому я подумал, что лучше всего добавить тесты для встроенного использования, которое вы обычно видите:

например.

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

и

var t = +new Date();

Результаты JSPerf показывают, что эти два не сильно отличаются по скорости: http://jsperf.com/get-time-vs-unary-plus/7

enter image description here

Проблема с предыдущими первыми результатами заключается в том, что пример не является практическим. На практике вы бы не стали тем же самым now. Вы просто сохранили бы результат getTime() один раз, если теперь он не изменился. Как показывают эти новые результаты, разница в скорости не является существенной в типичной ситуации использования.

Итак, я думаю, что общий совет: использовать для однократного использования +new Date() короче, но (new Date()).getTime() более читабельно (и чуть быстрее).

Date.now():

Если вы собираетесь использовать новый Date.now(), вы захотите реализовать рекомендуемую прокладку для поддержки старых браузеров из здесь

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

(Хотя я озадачен, почему они не просто используют анонимную функцию в этом примере)

Ответ 4

Все зависит от того, что вы сравниваете.

Фактически, запуск .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>

Ответ 5

ИМХО, когда нет большой разницы в производительности, разборчивость всегда должна побеждать. Мы все должны практиковать код записи WCTR для чтения ". Поэтому для меня это лучшая практика:

(new Date()).getTime();