你不知道的JavaScript——严格相等和宽松相等

宽松相等(loose equals)== 和严格相等(strict equals)=== 都用来判断两个值是否“相 等”,但是它们之间有一个很重要的区别,特别是在判断条件上。 常见的误区是“== 检查值是否相等,=== 检查值和类型是否相等”。听起来蛮有道理,然而 还不够准确。

正确的解释是:“== 允许在相等比较中进行强制类型转换,而 === 不允许。”

如果进行比较的两个值类型相同,则 == 和 === 使用相同的算法,所以除了 JavaScript 引擎 实现上的细微差别之外,它们之间并没有什么不同。 如果两个值的类型不同,我们就需要考虑有没有强制类型转换的必要,有就用 ==,没有就用 ===,不用在乎性能

特别注意:

• NaN 不等于 NaN

• +0 等于 -0(。

1. 字符串和数字之间的相等比较

因为没有强制类型转换,所以 a === b 为 false,42 和 "42" 不相等。 而 a == b 是宽松相等,即如果两个值的类型不同,则对其中之一或两者都进行强制类型 转换。

(1) 如果 Type(x) 是数字,Type(y) 是字符串,则返回 x == ToNumber(y) 的结果。 (2) 如果 Type(x) 是字符串,Type(y) 是数字,则返回 ToNumber(x) == y 的结果

2. 其他类型和布尔类型之间的相等比较

转换规则如下:

eg:x == y

(1) 如果 Type(x) 是布尔类型,则返回 ToNumber(x) == y 的结果;

(2) 如果 Type(y) 是布尔类型,则返回 x == ToNumber(y) 的结果。

 

3. null 和 undefined 之间的相等比较

(1) 如果 x 为 null,y 为 undefined,则结果为 true。

(2) 如果 x 为 undefined,y 为 null,则结果为 true。

4. 对象和非对象之间的相等比较

(1) 如果 Type(x) 是字符串或数字,Type(y) 是对象,则返回 x == ToPrimitive(y) 的结果;

(2) 如果 Type(x) 是对象,Type(y) 是字符串或数字,则返回 ToPromitive(x) == y 的结果。

• 如果两边的值中有 true 或者 false,千万不要使用 ==。

• 如果两边的值中有 []、"" 或者 0,尽量不要使用 ==。

猜你喜欢

转载自blog.csdn.net/qq_38021852/article/details/82817149