与日期对象相乘 - javascript

时间:2014-06-12 10:38:23

标签: javascript date

我遇到了这段代码var timeStamp = 1 * new Date();,令我惊讶的是它自1970/01/01以来以毫秒为单位返回值。这相当于使用.getTime()方法!

引擎盖下发生了什么?类型转换概念是否适用于此,它基本上将new Date()值转换为毫秒?

2 个答案:

答案 0 :(得分:7)

  

引擎盖下发生了什么?

简短版本:

因为它在数学运算中使用,日期会转换为数字,当您将日期转换为数字时,您获得的数字是毫秒 - 自该纪元(例如getTime()

长版:

  1. multiplication operator在其操作数上调用抽象操作ToNumber

  2. 对于像Date这样的对象,它在对象上调用抽象操作ToPrimitive,“首选类型”为“数字”。

  3. 对于大多数类型的对象(包括Date s),ToPrimitive调用抽象操作[[DefaultValue]],并将首选类型作为“提示”传递。

  4. [[DefaultValue]],hint =“number”在对象上调用valueOf。 (valueOf是一种真正的方法,与上面的抽象操作不同。)

  5. 对于Date个对象,valueOf会返回“时间值”,即您从getTime获得的值。


  6. 旁注:我没有理由想到使用var timeStamp = 1 * new Date()而不是var timeStamp = +new Date(),它具有相同的效果。或者当然,对于任何现代引擎(并且垫片都是微不足道的),var timeStamp = Date.now()more on Date.now)。

答案 1 :(得分:1)

数字转换

这是因为javascript中的数字转换与toString几乎相同,但内部更频繁地调用它。

在两种主要情况下执行数字转换:

  • 在需要数字的函数中:例如Math.sin(obj),isNaN(obj),包括算术运算符:+ obj。
  • 比较中,比如obj =='John'。 字符串相等===是异常,因为它不进行任何类型转换,并且当两个参数都是对象时也是非严格相等,而不是基元:obj1 == obj2。只有当两个参数都引用同一个对象时才是真的。

显式转换也可以使用Number(obj)完成。

数字转换算法:

  • 如果valueOf方法存在并返回一个原语,则返回它。

  • 否则,如果存在toString方法并返回原语,则返回它。

  • 否则,抛出异常。

在内置对象中,Date支持数字和字符串转换:

alert( new Date() ) // The date in human-readable form
alert( 1*new Date() ) // Microseconds from 1 Jan 1970

Further reading