这可能只是 JavaScript 的一个奇怪的怪癖,但我很好奇是否有人知道为什么会发生这种情况:
({} <= {}) => true
({} >= {}) => true
({} == {}) => false
({} === {}) => false
({} > {}) => false
({} < {}) => false
考虑到所有其他都是假的,为什么前两个是真的?
我认为它可能在比较之前将对象转换为数字,但是......
Number({}) >= Number({}) => false
vge*_*gel 18
使用</ <=/ >/>=在ES5运营商使用抽象关系比较算法,这是说它比较之前强制转换的类型,一个奇特的方式。当{}被 强制时[[ToPrimitive]],它会回退到该toString()方法,该方法"[object Object]"为两者都返回。因为小于/大于运算符的等于变量首先检查相等性,并且字符串相等,所以检查成功。对于非相等检查变体,它失败了,因为字符串是相等的。
==不使用相同的强制算法,它使用抽象平等比较算法。该算法检查的第一件事是类型是否相同——当然,对于两个裸对象,它们是相同的。因此,算法继续执行第一步,然后向下检查 f:
如果 x 和 y 引用同一个对象,则返回 true。否则,返回false。
每次使用{}都会创建一个新对象,因此此检查失败且结果为假。
===类似,只是没有强制步骤。它在步骤 7失败,该步骤使用与 AECA 的子步骤 f 相同的语言。
tl;dr: >=/<=以不同于==/ 的方式强制===。
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |