为什么Javascript比较运算符在数学上不一致?

时间:2014-05-01 05:03:34

标签: javascript date datetime type-conversion

在很久以前的数学课上,我被教导

  

a == b 当且仅当 a< = b且b< = a。

Javascript似乎不这么认为:

> new Date(400) <= new Date(400)
true
> new Date(400) >= new Date(400)
true
> new Date(400) == new Date(400)
false

有人可以解释导致此结果的类型强制规则吗?模糊等于运算符==似乎应该相信两个Date具有相等的值。

2 个答案:

答案 0 :(得分:3)

首先让我们从您要比较的内容开始:

typeof new Date(400)
"object"

Javascript对象使用方法.valueOf()来比较前两种情况中的值。一般对象默认情况下不知道如何比较,并使用字符串&#34; [object Object]&#34; 。另一方面,日期知道如何。

new Date(400) <= new Date(400)
new Date(400).valueOf() <= new Date(400).valueOf()
400 <= 400
true

但是,最后一个操作是针对不同的对象定义的,它会比较两个对象(不是上面的整数)是否具有相同的引用,因为它们都是单独创建的新对象。 / p>

new Date(400) == new Date(400)
false

如果您想以与前两个类似的方式比较日期值,则需要专门拨打.valueOf()

new Date(400).valueOf() == new Date(400).valueOf()
true

答案 1 :(得分:1)

Mozilla的documentation用于Javascript中的比较运算符,确认了关于==类型Object变量的定义{/ 1}。

  

如果两个操作数都是对象,则JavaScript比较内部   当操作数引用同一个对象时,引用是相等的   存储器中。

此特别说明仅适用于运营商==!=。这意味着,对于>=<=运算符,将比较对象本身,而不是内部引用。

自然的问题是:如何为两个<对象定义比较(<=>>=Date)?我无法找到任何参考资料,所以我想我们可能需要查看一些源代码来回答这个问题。