我们先来看一个经典的例子:
null > 0; // (1) false,进行类型转换,即 0 > 0
null == 0; // (2) false,不会进行类型转换
null >= 0; // (3) true,进行类型转换,即 0 >= 0
上面的结果完全打破了你对数学的认识。在最后一行代码显示“null 大于等于 0”的情况下,前两行代码中一定会有一个是正确的,然而事实表明它们的结果都是 false。
为什么会出现这种反常结果,这是因为相等性检查 == 和普通比较符 > < >= <= 的代码逻辑是相互独立的。进行值的比较时,null 会被转化为数字 0。这就是为什么(3)中 null >= 0 返回值是 true,(1)中 null > 0 返回值是 false。
一般我们认为,当使用==时,会先进行隐式类型转换(转换为数字类型)。
null 转换为 0,undefined 转换为 NaN,0 == NaN 结果应该为 false。
那为什么 null == undefined 结果会是 true 呢?
那是因为,undefined 和 null 在相等性检查 == 中不会进行任何的类型转换,它们有自己独立的比较规则,所以除了它们之间互等外,不会等于任何其他的值。
实际上,可以从 Javascript 规范中找到答案:
规范中提到, 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定 null 和 undefined 是相等的。
一些易错的例子:
null == null; // true
undefined == undefined; // true
null == undefined; // true
null === undefined; // false(类型不同)
null == 0; // false(null不会进行类型转换)
null == '\n0\n'; // false
null === +'\n0\n'; // false