在很久以前的数学课上,我被教导
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
具有相等的值。
答案 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
)?我无法找到任何参考资料,所以我想我们可能需要查看一些源代码来回答这个问题。