我将比较Math.abs(x)
and Math.abs(Date.parse(x))
,假设x
是一个Date
对象:
数学.abs(x)
根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.8.2,
15.8.2 数学对象的函数属性
以下每个 Math 对象函数都将ToNumber抽象运算符应用于其每个参数(如果有多个参数,则按从左到右的顺序),然后对生成的 Number 值执行计算。
根据http://ecma262-5.com/ELS5_Section_9.htm#Section_9.3,如果参数是对象,则ToNumber
应用以下步骤:
- 设 primValue 为ToPrimitive(输入参数,提示编号)。
- 返回到数字(primValue)。
根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.6,
(如果你想要完整的算法,请阅读http://ecma262-5.com/ELS5_Section_9.htm#Section_9.1和http://ecma262-5.com/ELS5_Section_8.htm#Section_8.12.8 )
Date 实例从 Date 原型对象继承属性,并且它们的 [[Class]] 内部属性值为“Date”。Date 实例也有一个 [[PrimitiveValue]] 内部属性。
[[PrimitiveValue]] 内部属性是此 Date 对象表示的时间值。
然后,Math.abs(x)
,其中x
是一个Date
对象,与 相同Math.abs(y)
,其中y
y 是一个数字,其中包含由 表示的时间值x
。
数学.abs(日期。解析(x))
根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.4.2,
15.9.4.2 日期解析(字符串)
parse 函数将ToString运算符应用于其参数,并将生成的 String 解释为日期和时间;它返回一个数字,对应于日期和时间的 UTC 时间值。根据字符串的内容,字符串可能被解释为本地时间、UTC 时间或其他时区的时间。
根据http://ecma262-5.com/ELS5_Section_15.htm#ELS5_Section_15.9.5.2
15.9.5.2 Date.prototype.toString()
此函数返回一个字符串值。String 的内容取决于实现,但旨在以方便、人类可读的形式表示当前时区中的日期。
笔记
对于任何毫秒数为零的Date 值 d , Date.parse(d.toString())的结果等于 d.valueOf()。见 15.9.4.2。
根据http://ecma262-5.com/ELS5_Section_15.htm#Section_15.9.5.8,
15.9.5.8 Date.prototype.valueOf()
valueOf 函数返回一个数字,也就是这个时间值。
然后,Math.abs(Date.parse(x))
,其中x
是一个Date
对象,与 相同Math.abs(y)
,其中y
y 是一个包含 的时间值的数字x
。
结论
如果毫秒数为零,您可以确定它们是相等的。
如果不是,结果可能取决于实现,但我猜在大多数实现中结果是相同的。
补充说明
请注意,它Date.parse
需要一个字符串,因此您不需要使用Date.parse(x)
ifx
已经是一个Date
对象。
当您对规范有疑问时,您可以前往