比较 null 和 0, 你真的整明白了?

2,077 阅读1分钟

先抛出问题

null == 0 // false
null > 0 // false
null >= 0 // true

恭喜都答对的同学,可以撤了,你已经掌握了;但是继续看完加深理解也不错呀~

没答对的同学,我们还是老实的看看这是咋回事呢?

逐一分析

null == 0

按照一贯的思路,在使用 == 进行对比时,如果一侧是 number 类型的数据,则会将非 number 类型的数据转为 number,然后在进行比较,我们就可以得出一下结论:

null == 0;
// 进行类型转换
(null = 0 + null) == +0;
// 得到
0 == 0;
// 最终结果得到 true
true;

但是事实并非如此🥲

根据对应的规范,数字转换实际上并没法发生在 nullundefined 的一侧。如果在等号的一侧有 nullundefined,则另外一侧的表达式必须是 nullundefined,才会返回 true 。所以,正确的结果是:

null == 0 // false
undefined == 0 // false

// 只有几种情况才会返回 true
null == undefined // true
null == null // true
undefined == undefined // true

null > 0

先看结果,这题相信大家都能答对,但是还是得来解析一下过程,加深印象哈~

null > 0 // false

这里的操作不同于上面的 == 的操作,这里会将 null 转为数字,然后在进行比较。

null > 0
+null > +0
0 > 0
false

null >= 0

看到这个,大家的第一映象可能是 null == 0 || null > 0, 既然 null == 0falsenull > 0 也是 false,那结果肯定是 false。但是事实却是:true,简直就是 wtf~

null >= 0 // true

实际上 >= 以一种非常不同的方式工作,这基本上与 < 操作符相反,因此可以这样子去理解这个过程:

null >= 0
// 直接反着来,接着和 null > 0 一样的过程
!(null < 0)
!(+null < 0)
!(0 < 0)
// 最后得出结果取反
!(false)
true

参考

写在最后

小前端一枚,不生产代码,只是代码的搬运工,当然也希望能对大家有所帮助(●>ω<●)。