你真的了解“==”吗?

下面两个代码段的输出是?

var a = [0];
if ([0]) {
  console.log(a == true);
} else {
  console.log("wut");
}
[]==[]

答案:false, false

解析:如果单纯的把[0]转换成boolean类型的话,结果会是true,所以if判断语句的结果是true。 

[] == ![];
[] == false;

答案:true,true 当空数组作为判断条件时,相当于true。当空数组与布尔值直接比较时,相当于false

看了很多其他的博客,都有说到“==”会做类型转换,比较其值,我觉得这个答案依然无法详细解释上述代码的结果。

查阅了更多资料后,找到了一些“==“的规则:

1、如果两个值类型相同,进行 === 比较,比较规则同上 
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较: 
a、如果一个是null、一个是undefined,那么[相等]。 
b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。 
c、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。 
d、如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。非js核心的对象,(比较麻烦,我也不大懂) 
e、任何其他组合(array数组(两个不同的实例)等),都不相等。

所以其实”==“的转换规则,并没有想象的那么简单,由此可见[0] == true, 应该采用的是规则c, 而[] == [] 应该采用的是规则e.

发布了68 篇原创文章 · 获赞 32 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Web_J/article/details/90414882