JavaScript 之 == 与 === 的区别

宽松相等(==)与严格相等(===)二者都是用于判断两个值是否相等,但它们在判断条件上有很大的区别,== 允许在相等比较中进行强制类型转换,而===不允许。==和===都会检测操作数的类型,区别在于操作数类型不同时,它们的处理方式不同。

如何解释

  • 错误的解释:“==检查值是否相等,===检查值和类型是否相等。” 在此解释中,===似乎比==做的事情更多,因为它还要检查值的类型。

  • 正确的解释:“==允许在相等比较中进行隐式强制类型转换,而===不允许。” 在此解释中,==的工作量更大一些,因为如果值的类型不同,还需要进行强制类型转换。

如何转换

  • 值类型相同:==和===使用相同的算法,所以除了JS引擎实现上的细微差别之外,它们之间并没有什么不同。

  • 值的类型不同:我们就需要考虑是否有强制类型转换的必要,若有就用==,没有就用===,不用在乎性能。

特殊例子

假值相等比较

null与undefined

在 == 中 null 和 undefined 相等(它们与其自身相等),除此之外其他值都不存在这种情况。即,在 == 中 null 与 undefined 是一回事,可以相互进行隐式强制类型转换。

布尔与数字、字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
Number(true) = 1
Number(false) = 0
1 == true; // true
0 == false; // true
"1" == true; //true
"0" == true; //false
"0" == false; //true
if("0"){
console.long("0");//能输出
}
if(0){
console.long("0");//不能输出
}