日期和数字之间的相等比较不起作用
Equality comparison between Date and number doesn't work
根据 ECMA 脚本标准,以下代码应该 return 正确,但事实并非如此:
d = new Date() ;
d.setTime(1436497200000) ;
alert( d == 1436497200000 ) ;
第 11.9.3 节说:
- If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
然后,8.12.8 节说 ToPrimitive
返回 valueOf
方法的结果。这意味着我上面示例中的最后一行应该等同于:
alert( d.valueOf() == 1436497200000 );
return true
确实如此。
为什么第一种情况不是return true
?
如果您查看 8.12.8 部分的规范,您会在该部分末尾附近找到以下文本:
When the [[DefaultValue]]
internal method of O
is called with no hint, then it behaves as if the hint were Number
, unless O
is a Date
object (see 15.9.6), in which case it behaves as if the hint were String
.
(强调我的)
现在,在抽象相等比较算法的步骤8
/9
中[11.9.3][ =48=、ToPrimitive(x)
和 ToPrimitive(y)
的调用没有 hint
参数。
缺少此 hint
参数以及上面的文本,意味着 ToPrimitive
方法 returns 日期对象上的 toString()
值。
您可能已经知道,(new Date()).toString()
returns 美式英语日期的字符串表示 [source]:
"Wed Jul 01 2015 22:08:41 GMT+0200 (W. Europe Daylight Time)"
像这样的字符串不等于 1436497200000
不足为奇。 ;-)
ToPrimitive(A) 尝试通过在 A.
上调用不同的 A.toString 和 A.valueOf 方法序列来将其对象参数转换为原始值
因此,如果 toString()
调用成功,则不会调用 valueOf()
。
根据 ECMA 脚本标准,以下代码应该 return 正确,但事实并非如此:
d = new Date() ;
d.setTime(1436497200000) ;
alert( d == 1436497200000 ) ;
第 11.9.3 节说:
- If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
然后,8.12.8 节说 ToPrimitive
返回 valueOf
方法的结果。这意味着我上面示例中的最后一行应该等同于:
alert( d.valueOf() == 1436497200000 );
return true
确实如此。
为什么第一种情况不是return true
?
如果您查看 8.12.8 部分的规范,您会在该部分末尾附近找到以下文本:
When the
[[DefaultValue]]
internal method ofO
is called with no hint, then it behaves as if the hint wereNumber
, unlessO
is aDate
object (see 15.9.6), in which case it behaves as if the hint wereString
.
(强调我的)
现在,在抽象相等比较算法的步骤8
/9
中[11.9.3][ =48=、ToPrimitive(x)
和 ToPrimitive(y)
的调用没有 hint
参数。
缺少此 hint
参数以及上面的文本,意味着 ToPrimitive
方法 returns 日期对象上的 toString()
值。
您可能已经知道,(new Date()).toString()
returns 美式英语日期的字符串表示 [source]:
"Wed Jul 01 2015 22:08:41 GMT+0200 (W. Europe Daylight Time)"
像这样的字符串不等于 1436497200000
不足为奇。 ;-)
ToPrimitive(A) 尝试通过在 A.
上调用不同的 A.toString 和 A.valueOf 方法序列来将其对象参数转换为原始值因此,如果 toString()
调用成功,则不会调用 valueOf()
。