为啥 Javascript 比较运算符在数学上不一致?
Posted
技术标签:
【中文标题】为啥 Javascript 比较运算符在数学上不一致?【英文标题】:Why are Javascript comparison operators mathematically inconsistent?为什么 Javascript 比较运算符在数学上不一致? 【发布时间】:2014-06-17 14:42:23 【问题描述】:很久以前在数学课上我被教过
a == 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
的值相等。
【问题讨论】:
两个日期是两个不同的对象,数学不适用,特别是运算符,不要混淆它们,它们有不同的规则。在某些情况下,日期会变得字符串化。 【参考方案1】:首先让我们从您要比较的内容开始:
typeof new Date(400)
"object"
Javascript 对象使用.valueOf()
方法来比较前两种情况下的值。默认情况下,一般对象不知道如何相互比较,而是使用字符串 "[object Object]"。另一方面,日期知道如何做。
new Date(400) <= new Date(400)
new Date(400).valueOf() <= new Date(400).valueOf()
400 <= 400
true
但是,最后一个操作对对象的定义不同,它比较两个对象(不是上面的整数)是否具有相同的引用,它们不会,因为它们都是单独创建的新对象。
new Date(400) == new Date(400)
false
如果您想以与前两个类似的方式比较日期值,则需要专门调用 .valueOf()
。
new Date(400).valueOf() == new Date(400).valueOf()
true
【讨论】:
你的推理似乎不正确,即:new Date(400) >= new Date(401)
:false
。
@AndrewMao 谢谢,我把答案写在脑海里,现在检查了一下,发现我错了。【参考方案2】:
Mozilla 的 documentation 用于 Javascript 中的比较运算符确认 Nit 关于 ==
的声明是为 Object
类型的变量定义的。
如果两个操作数都是对象,那么 JavaScript 比较内部 当操作数引用同一对象时,引用相等 记忆。
此特别说明仅适用于运算符==
和!=
。这意味着,对于 >=
和 <=
运算符,比较对象本身,而不是内部引用。
自然的问题是:如何为两个 Date
对象定义比较(<
、<=
、>
、>=
)?我找不到任何参考资料,所以我想我们可能需要查看一些源代码来回答这个问题。
【讨论】:
以上是关于为啥 Javascript 比较运算符在数学上不一致?的主要内容,如果未能解决你的问题,请参考以下文章