8

根据 ECMA 脚本标准,以下代码应该返回 true,但它不会:

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

11.9.3节说:

  1. 如果 Type(x) 是 String 或 Number 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。

然后,第8.12.8节说返回方法ToPrimitive的结果valueOf。这意味着我上面示例中的最后一行应该等同于:

alert( d.valueOf() == 1436497200000 );

确实返回true

为什么第一个案例不返回true

4

2 回答 2

5

如果您查看第8.12.8节中的规范,您会在该节末尾附近找到此文本:

当在没有提示的情况下调用 的[[DefaultValue]]内部方法时O,它的行为就像提示是Number除非 O是一个Date对象(参见 15.9.6),在这种情况下,它的行为就像提示是String

(强调我的)

现在,在抽象相等比较算法[ 11.9.3 ]8的步骤/9中,并且在没有参数的情况下调用。 ToPrimitive(x)ToPrimitive(y)hint

缺少此hint参数以及上面的文本意味着该ToPrimitive方法返回toString()日期对象的值。

您可能知道,(new Date()).toString()返回美式英语[ source ]中日期的字符串表示形式:
"Wed Jul 01 2015 22:08:41 GMT+0200 (W. Europe Daylight Time)"

像这样的字符串不等于不1436497200000应该是一个大惊喜。;-)

于 2015-07-01T20:10:06.983 回答
0

ToPrimitive(A) 尝试将其对象参数转换为原始值,方法是尝试在 A 上调用不同的 A.toString 和 A.valueOf 方法序列。

所以如果toString()调用成功,它不会调用valueOf().

于 2015-07-01T20:12:20.310 回答