Пожалуйста, объясните, почему и как + новая дата(); работает как "обход" для Date.now() в IE8 или ниже

(Я читаю книгу "Профессиональный JavaScript для веб-разработчиков", чтобы дать контекст по этому вопросу, в частности, глава 5 по ссылочным типам)

Мне интересно, почему и как var start = +new Date(); работает, чтобы получить текущее миллисекундное представление теперь как обход для браузеров (например: IE8), которые не поддерживают ECMAScript 5 Date.now()?

Что делает оператор + здесь по сравнению с простым старым new Date(), который также получает текущую дату и время?

Ответ 1

Что происходит, так это то, что вы сначала создаете новый объект Date, а затем набрасываете его на число.

TL; DR-версия

Под капотом время выполнения вызывает valueOf метод Date.

Многословной-версия

возвращает новый объект Date

var d = new Date;

используйте Unary + Operator

var n = +d;

Унарный оператор + вызывает внутренний ToNumber с d.

9.3 ToNumber

Принимает входной аргумент, и если тип аргумента Object (Date) вызывает внутренний ToPrimitive с вводом и подсказкой Число.

9.1 ToPrimitive

принимает входной аргумент и необязательный аргумент PreferredType.

если тип ввода - это объект, спецификация говорит:

Возвращает значение по умолчанию для объекта. Значение по умолчанию для объекта извлекается путем вызова [[DefaultValue]] внутреннего метода объект, передавая необязательный подсказку PreferredType. Поведение [[DefaultValue]] внутренний метод определяется этой спецификацией для все собственные объекты ECMAScript в 8.12.8.

8.12.8 [[DefaultValue]] (подсказка)

Когда внутренний метод O [[DefaultValue]] вызывается с подсказкой Number, выполняются следующие шаги:

  • Пусть valueOf является результатом вызова внутреннего метода [[Get]] объекта O с аргументом "valueOf".
  • Если IsCallable (valueOf) истинно, тогда,
    • Пусть val является результатом вызова внутреннего метода [[Call]] значенияOf, с O в качестве этого значения и пустым списком аргументов.
    • Если val является примитивным значением, верните val.

В коде это примерно соответствует:

var val,
    type,
    valueOf = O.Get( 'valueOf' );

if ( typeof valueOf === 'function' ) {
    val = valueOf.call( O );
    type = typeof val;
    if ( val == null || type === 'boolean' || type === 'number' || type === 'string' ) {
        return val;
    }
}

[[Get]] ting внутренний метод O с аргументом "valueOf" в основном означает возвращение Date.prototype.valueOf.

15.9.5.8 Date.prototype.valueOf()

Функция valueOf возвращает номер, который значение этого времени.

Если мы вернемся к 9.3 ToNumber, мы увидим, что ToNumber вызывает себя, на этот раз с возвращенным val из 8.12.8 [[DefaultValue]] (подсказка) как primValue. Если тип аргумента - Number, он говорит:

Результат равен входному аргументу (без преобразования).

Конец

Ответ 2

Функция Date.now() в IE:

return a number of milliseconds between midnight, January 1, 1970, and the current date and time.

Требования

Not supported in installed versions earlier than Internet Explorer 9. However, it is supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards, Internet Explorer 8 standards, Internet Explorer 9 standards, Internet Explorer 10 standards. Also supported in Windows Store apps.

Чтобы получить текущий объект Date в IE8, вы можете использовать это:

if (typeof Date.now() === 'undefined') {
  Date.now = function () { 
      return new Date(); 
  }
}

Для получения значения времени в объекте Date (как миллисекунды с полуночи 1 января 1970 года). на IE8 вы можете использовать это:

var currentDateTime = +new Date(); 

Ответ 3

Унарный + operator преобразует значение в число. Например, +"123" преобразует строку "123" в число 123. Это также будет работать для даты, а дата, преобразованная в число, дает количество миллисекунд.