我正在阅读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不支持运算符重载,或者只有少量非重载非运算符函数(add
,toString
,等等)。
JS似乎没有为一元+特别具有任何此类功能(或根本就是数字版本),所以这是怎么做的?
答案 0 :(得分:1)
一元运算符+如果已经没有,则将其操作数转换为数字。
所以+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会返回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)