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

时间:2015-07-01 19:53:04

标签: javascript comparison date-comparison value-of type-coercion

根据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)。
  2.   

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

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

确实会返回true

为什么第一种情况不会返回true

2 个答案:

答案 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()