根据ECMA脚本标准,以下代码应返回true,但不会:
d = new Date() ;
d.setTime(1436497200000) ;
alert( d == 1436497200000 ) ;
第11.9.3节说:
- 如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
醇>
然后,第8.12.8部分说ToPrimitive
返回valueOf
方法的结果。这意味着上面示例中的最后一行应该等同于:
alert( d.valueOf() == 1436497200000 );
确实会返回true
。
为什么第一种情况不会返回true
?
答案 0 :(得分:5)
如果您查看8.12.8部分的规范,您会在该部分的末尾附近找到此文字:
如果在没有提示的情况下调用
[[DefaultValue]]
的{{1}}内部方法,则其行为就像提示为O
, ,除非 < / strong>Number
是一个O
对象(见15.9.6),在这种情况下,它的行为就像提示是Date
一样。
(强调我的)
现在,在抽象平等比较算法 [11.9.3] 的步骤String
/ 8
中,{{1没有9
参数调用{}和ToPrimitive(x)
。
缺少此ToPrimitive(y)
参数以及上述文本意味着hint
方法会在日期对象上返回hint
值。
您可能知道,ToPrimitive
在美式英语 [source] 中返回日期的字符串表示形式:
toString()
这样的字符串不等于(new Date()).toString()
不应该是一个惊喜。 ; - )
答案 1 :(得分:0)
ToPrimitive(A)尝试通过在A上调用A.toString和A.valueOf方法的不同序列来尝试将其对象参数转换为原始值。
因此,如果toString()
调用成功,则不会调用valueOf()
。