【发布时间】:2015-09-19 03:35:18
【问题描述】:
根据 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?
【问题讨论】:
-
第一个将对象与数字作为字符串进行比较。您可以使用
alert( +d == 1436497200000)强制进行数值比较。 -
你引用的那段是关于 x 的类型,它是 left hand 操作数。在您的情况下,这不是字符串或数字。
-
@brso05:那个“文章”是官方 EcmaScript标准的手动转换。
-
@dandavis,好的,但是为什么它不像规范所说的那样工作?还是我看错了?
-
"当 O 的 [[DefaultValue]] 内部方法在没有提示的情况下被调用时,它的行为就像提示是数字一样,除非 O 是一个 Date 对象 (见 15.9.6),在这种情况下,它的行为就像提示是字符串一样。” - 所以当我尝试
alert(d == "Fri Jul 10 2015 13:00:00 GMT+1000 (AUS Eastern Standard Time)")时,它会返回true。
标签: javascript comparison date-comparison value-of type-coercion