我遇到了这段代码var timeStamp = 1 * new Date();
,令我惊讶的是它自1970/01/01以来以毫秒为单位返回值。这相当于使用.getTime()
方法!
引擎盖下发生了什么?类型转换概念是否适用于此,它基本上将new Date()
值转换为毫秒?
答案 0 :(得分:7)
引擎盖下发生了什么?
简短版本:
因为它在数学运算中使用,日期会转换为数字,当您将日期转换为数字时,您获得的数字是毫秒 - 自该纪元(例如getTime()
)
长版:
multiplication operator在其操作数上调用抽象操作ToNumber
。
对于像Date
这样的对象,它在对象上调用抽象操作ToPrimitive
,“首选类型”为“数字”。
对于大多数类型的对象(包括Date
s),ToPrimitive
调用抽象操作[[DefaultValue]]
,并将首选类型作为“提示”传递。
[[DefaultValue]]
,hint =“number”在对象上调用valueOf
。 (valueOf
是一种真正的方法,与上面的抽象操作不同。)
对于Date
个对象,valueOf
会返回“时间值”,即您从getTime
获得的值。
旁注:我没有理由想到使用var timeStamp = 1 * new Date()
而不是var timeStamp = +new Date()
,它具有相同的效果。或者当然,对于任何现代引擎(并且垫片都是微不足道的),var timeStamp = Date.now()
(more on Date.now
)。
答案 1 :(得分:1)
数字转换
这是因为javascript中的数字转换与toString几乎相同,但内部更频繁地调用它。
在两种主要情况下执行数字转换:
显式转换也可以使用Number(obj)完成。
数字转换算法:
如果valueOf方法存在并返回一个原语,则返回它。
否则,如果存在toString方法并返回原语,则返回它。
否则,抛出异常。
在内置对象中,Date支持数字和字符串转换:
alert( new Date() ) // The date in human-readable form
alert( 1*new Date() ) // Microseconds from 1 Jan 1970