JavaScript null检查疑惑:为何0 >= null的结果为true?
为什么
0 >= null返回true,和你列的其他几个比较结果完全矛盾? 你记录的这几个运算结果没有任何错:
0 > null // false 0 === null // false 0 == null // false 0 >= null // true
之所以会出现这种看起来离谱的结果,核心是几乎所有人对JS的>=运算符存在普遍的直觉误解。
先打破常识误区
大家默认a >= b的逻辑是:只要a比b大,或者a和b相等,就返回true,也就是等价于a > b || a == b。但JS从设计之初就没这么实现过这个运算符。
按照ECMAScript的官方规则,大于等于运算符的定义非常反直觉:
a >= b的计算逻辑完全等价于!(a < b)。它根本不会去判断a和b是否相等,只是把a < b的比较结果取反,和==的相等判断没有任何关系。
一步步推导出计算结果
搞懂这个规则之后,整个逻辑就通了:
- 当执行
0 < null这类大小关系比较时,JS会触发抽象关系比较的强制转换规则:如果操作数是null,会先把它转成对应的数值,而null转数字的结果刚好是0。 - 转换完成后,原本的比较就变成了纯数字的
0 < 0,这个比较的结果显然是false。 - 把这个结果套回
>=的定义:0 >= null=!(0 < null)=!(false)=true,这就是最终结果的来源。
为什么其他三个比较结果都是false?
其实把JS的三套独立比较规则摆出来,就不会觉得矛盾了——这三套规则的强制转换逻辑完全不互通:
0 > null:按照同样的转换逻辑,这个比较等价于!(null < 0),转换后计算的是!(0 < 0),结果自然是false。0 == null:相等比较的规则和大小比较的转换逻辑是完全割裂的——==判断时,null只有和undefined比较才会返回true,碰到数字0的时候根本不会触发“转成0”的操作,所以结果是false。0 === null:严格相等完全不会做任何类型转换,数字类型和Null类型本身就不属于同一种数据类型,自然直接返回false。
这个坑的本质其实就是JS设计的历史遗留问题:null在做大小比较的时候会被强制转成0,但在做相等判断的时候不会主动转成0,两套规则的分裂才导致了这种看似荒谬的结果。
内容的提问来源于stack exchange,提问作者John Mutuma
相关产品推荐
相关产品推荐

