Пожалуйста, объясните, почему и как + новая дата (); работает как обходной путь для Date.now () в IE8 или ниже - PullRequest
36 голосов
/ 24 февраля 2012

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

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

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

Ответы [ 3 ]

57 голосов
/ 24 февраля 2012

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

TL; DR-версия

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

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

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

var d = new Date;

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

var n = +d;

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

9,3 ToNumber

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

9,1 ToPrimitive

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

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

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

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

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

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

15.9.5.8 Date.prototype.valueOf ()

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

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

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

Конец

7 голосов
/ 09 мая 2013

Функция 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(); 
6 голосов
/ 24 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...