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

Get*_*ree 8 javascript comparison date-comparison value-of type-coercion

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

d = new Date() ;
d.setTime(1436497200000) ;
alert( d == 1436497200000 ) ;
Run Code Online (Sandbox Code Playgroud)

11.9.3节说:

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

然后,第8.12.8节说,ToPrimitive重新调整valueOf方法的结果.这意味着上面示例中的最后一行应该等效于:

alert( d.valueOf() == 1436497200000 );
Run Code Online (Sandbox Code Playgroud)

事实true确实如此.

为什么第一种情况不归true

Cer*_*rus 5

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

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

(强调我的)

现在,在步骤8/ 9中的摘要相等比较算法 [ 11.9.3 ],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不应该是一个大惊喜.;-)

  • 所以`toPrimitive`在这种情况下没有给出任何暗示,即使它已经与一个数字进行了比较. (2认同)