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

How does Date's constructor overload the unary +?

本文关键字:一元 重载 构造函数 何重载 Date      更新时间:2023-09-26

我正在阅读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构造函数返回一个对象,当通过一元(但不是通过加法)转换为数字时,该对象返回一个表示 Unix 纪元的数字。

这怎么可能?阅读该主题,似乎JS不支持运算符重载,或者如果重载非运算符函数(addtoString等)计数,则仅支持少量。

JS似乎对一元+没有任何这样的功能(或者似乎根本没有数字强制),那么这是怎么做到的呢?

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

所以+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 对象有什么特别之处,它使在其上调用号码返回 Unix 时间?

日期对象基于时间值,该时间值是自 1970 年 1 月 1 日 UTC 以来的毫秒数(来自 MDN)。因此,当我们要求它将其转换为数字时,它会返回毫秒。

日期的自动类型转换。

Date 对象的

基元数值(由 Date.prototype.getValue() 返回)是 Unix 时间戳,是自 1970 年 1 月 1 日 UTC 以来的毫秒数,是转换为数字的 Date 对象的值。

当在一元 + 运算符之后将对象转换为数字时,javascript 引擎显式要求对象返回一个数字,方法是调用对象内部toPrimitive方法,提示值为 "number",如 ES6 标准第 7.1.1 节中所述。此机制以相当标准的方式将 Date 对象转换为一元 + 符号后的毫秒。

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

以下是来自 MDN 的一元加号的一些描述:

一元加运算符位于其操作数之前并计算其操作数,但尝试将其转换为数字(如果尚未转换为数字)。

如果运算符无法解析字符串/值,则返回 NaN