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 不支持运算符重载,或者如果重载非运算符函数(add
、toString
,无论)是否重要,则只支持少量。
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 在这方面很特殊,与大多数其他对象不同。
我正在阅读 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 不支持运算符重载,或者如果重载非运算符函数(add
、toString
,无论)是否重要,则只支持少量。
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 在这方面很特殊,与大多数其他对象不同。