为啥 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) &gt;= new Date(401):false @AndrewMao 谢谢,我把答案写在脑海里,现在检查了一下,发现我错了。【参考方案2】:

Mozilla 的 documentation 用于 Javascript 中的比较运算符确认 Nit 关于 == 的声明是为 Object 类型的变量定义的。

如果两个操作数都是对象,那么 JavaScript 比较内部 当操作数引用同一对象时,引用相等 记忆。

此特别说明仅适用于运算符==!=。这意味着,对于 &gt;=&lt;= 运算符,比较对象本身,而不是内部引用。

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

【讨论】:

以上是关于为啥 Javascript 比较运算符在数学上不一致?的主要内容,如果未能解决你的问题,请参考以下文章

为啥数学库经常被 FLOPS 比较?

带你掌握 JavaScript 类型值的比较

为啥模运算符的行为与数学派系 MOD 不同

JavaScript基础——数值与数学

JavaScript运算符

为啥 Go 没有三元条件运算符 [关闭]