日期和数字之间的相等比较不起作用

Equality comparison between Date and number doesn't work

根据 ECMA 脚本标准,以下代码应该 return 正确,但事实并非如此:

d = new Date() ;
d.setTime(1436497200000) ;
alert( d == 1436497200000 ) ;

11.9.3 节说:

  1. 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()