Ответ 1
Что происходит, так это то, что вы сначала создаете новый объект Date, а затем набрасываете его на число.
TL; DR-версия
Под капотом время выполнения вызывает valueOf
метод Date
.
Многословной-версия
возвращает новый объект Date
var d = new Date;
используйте Unary + Operator
var n = +d;
Унарный оператор + вызывает внутренний ToNumber с d
.
Принимает входной аргумент, и если тип аргумента Object
(Date) вызывает внутренний 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, он говорит:
Результат равен входному аргументу (без преобразования).
Конец