null == undefined为true的正确理解

我们先来看一个经典的例子:

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
© 2022  Arvin Xiang
Built with ❤️ by myself