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

时间:2016-02-27 02:25:30

标签: javascript operator-overloading

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

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

JS似乎没有为一元+特别具有任何此类功能(或根本就是数字版本),所以这是怎么做的?

3 个答案:

答案 0 :(得分:1)

一元运算符+如果已经没有,则将其操作数转换为数字。

所以+new DateNumber(new Date)类似。

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

Number(new Date()) // 1456541132899

+new Date() // 1456541132899

更新

Date对象的特殊之处在于它上面调用Number会返回Unix时间吗?

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

答案 1 :(得分:1)

日期的自动类型转换。

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

当在一元+运算符之后将对象转换为数字时,javascript引擎显式要求对象返回一个数字,方法是调用对象内部toPrimitive方法,提示值为“number”,如部分所述7.1.1 of the ES6 standard。这种机制将Date对象转换为以一种标准方式进行一元+符号后的毫秒。

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

答案 2 :(得分:-1)

以下是关于MDN的一元加号的一点描述:

  

一元加号运算符在其操作数之前,并计算其操作数,但是如果它已经没有,则尝试将其转换为数字。

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