Date 的构造函数如何重载一元 +
How does Date's constructor overload the unary +?
我正在阅读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不支持运算符重载,或者如果重载非运算符函数(add
,toString
等)计数,则仅支持少量。
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
。
- 重载JS'firefox中的对象原型
- onchange值为select的重载页面
- Javascript重载了括号
- 如何使用Ajax重载从页面返回特定的表
- GWT中带有清除缓存的硬重载
- 重载像$(document).ready这样的函数是错误的
- 在JavaScript中重载函数
- 调用函数以在DataTables重载中传递参数
- 解释javascript中的+var和-var一元运算符
- 无法重载 Ajax.BeginForm 的提交方法
- 重载构造函数
- TypeScript无效的重载签名-与实现不兼容
- jQuery position()/offset()值在重载时出错(chrome)
- dojo-dgrid带有store from url(json数据)重载/刷新按钮
- javascript中的函数重载使两个函数名称相同,但输入数字不同
- 在typescript中重载一个方法
- jquery和页面重载
- jQuery页面重载时淡出
- jqgrid-子网格在reloadGrid上折叠(父网格自动重载)
- Date 的构造函数如何重载一元 +