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

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

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

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

Случается, что вы сначала создаете новый объект Date, а затем бросаете его на число.

TL; DR-версия

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

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

Вернуть новый объект Date

 var d = new Date; 

Используйте оператор Unary +

 var n = +d; 

Оператор unary + вызывает внутренний 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]] с номером подсказки, выполняются следующие шаги:

  1. Пусть valueOf является результатом вызова внутреннего метода объекта [[Get]] объекта O с аргументом «valueOf».
  2. Если IsCallable (valueOf) истинно,
    1. Пусть val является результатом вызова внутреннего метода [[Call]] значенияOf, с O как это значение и пустым списком аргументов.
    2. Если 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 возвращает Number, который является значением этого времени .

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

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

Конец

Функция 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(); 

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

Давайте будем гением компьютера.