Date 的构造函数如何重载一元 +?

How does Date's constructor overload the unary +?

我正在阅读 this answer to Hidden Features of JavaScript? 并且对这种行为感到困惑:

> new Date
< Fri Feb 26 2016 21:15:43 GMT-0500 (EST)
> +new Date
< 1456539382581
< 0 + new Date + 0
"0Fri Feb 26 2016 21:17:39 GMT-0500 (EST)0"

因此,Date 构造函数 returns 一个对象,当通过一元(但不是通过加法)转换为数字时 returns 一个代表 Unix 纪元的数字。

这怎么可能?阅读有关该主题的内容,似乎 JS 不支持运算符重载,或者如果重载非运算符函数(addtoString,无论)是否重要,则只支持少量。

JS 似乎没有专门针对一元 + 的函数(或者似乎根本没有数字强制),那么这是怎么做到的?

这里是MDN

关于一元加法的一些描述

The unary plus operator precedes its operand and evaluates to its operand but attempts to converts it into a number, if it isn't already.

如果运算符无法解析 string/value,它 returns NaN

一元运算符 + 将其操作数转换为数字(如果尚未转换)。

所以 +new Date 类似于 Number(new Date)

new Date() // Fri Feb 26 2016 21:45:32 GMT-0500 (EST)

Number(new Date()) // 1456541132899

+new Date() // 1456541132899

更新:

Date 对象有什么特别之处,使得调用它的 Number return 成为 Unix 时间?

日期对象基于一个时间值,该时间值是自 1970 年 1 月 1 日 UTC(来自 MDN)以来的毫秒数。所以,当我们要求它把它转换成一个数字时,它是有意义的,它 return 是我们毫秒。

日期的自动类型转换。

Date 对象的原始数值,return由 Date.prototype.getValue() 编辑,是 Unix 时间戳,自 1970 年 1 月 1 日 UTC 以来的毫秒数,是 Date 对象的值转换为数字。

在一元 + 运算符后将对象转换为数字时,javascript 引擎通过使用7.1.1 of the ES6 standard 节中描述的“number”的提示值。此机制以相当标准的方式将 Date 对象转换为一元 + 符号后的毫秒数。

那么如何解释 Date 对象在用作 非一元加 的操作数时如何转换为 字符串 ?。似乎对于非一元情况,类型转换请求对象的原始值 而不提供结果类型提示 和 . . . Date 提供了一个奇异的 toPrimitive function,它默认将日期转换为 string 而不是 number。 Date 和 Symbol 在这方面很特殊,与大多数其他对象不同。