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节说:
- 如果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
?
如果您查看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
不应该是一个大惊喜.;-)