宽松相等和严格相等(==和===)

60次阅读

共计 957 个字符,预计需要花费 3 分钟才能阅读完成。

在 JS 书籍和博客中常见的一个误区是:“== 检查值是否相等,=== 检查值和类型是否相等”。
正确的解释是:“== 允许在相等比较中进行强制类型转换,而 === 不允许”。== 和 === 都会检查操作数的类型。区别在于操作数类型不同时它们的处理方式不同。
如果进行比较的两个值类型相同,则 == 和 === 使用相同的算法,所以除了 JavaScript 引擎实现上的细微差别之外,它们之间并没有什么不同。
如果两个值的类型不同,我们就需要考虑有没有强制类型转化的必要,有就用 ==,没有就用 ===,不用在乎性能。

如果 2 个值的类型相同,就仅比较它们是否相等。特殊情况:
NaN 不等于 NaN
+ 0 等于 -0

对象的宽松相等 ==,两个对象指向同一个值时,即视为相等,不发生强制类型转换。
== 在比较两个不同类型的值时会发生隐式强制类型转换,会将其中之一或两者都转换为相同的类型后在进行比较。a) 字符串和数字之间的相等比较 如果 x 是数字,y 是字符串,则返回 x == ToNumber(y) 如果 x 是字符串,y 是数字,则返回 ToNumber(x) == yb) 其他类型和布尔类型之间的相等比较 如果 x 是布尔类型,则返回 ToNumber(x) == y 如果 y 是布尔类型,则返回 x == ToNumber(y) 建议无论什么情况下都不要使用 ==true 和 ==false
c) undefined 和 null 之间的相等比较 如果 x 是 null,y 是 undefined,则结果为 true 如果 x 是 undefined,y 是 null, 则结果为 true 在 == 中 undefined 和 null 相等(它们也与其自身相等),除此之外其他值都不存在这种情况。也就是说,在 == 中 null 和 undefined 是一回事,可以相互进行隐式强制类型转换。
d) 对象(对象 / 函数 / 数组)和非对象(数字 / 字符串 / 布尔值)之间的相等比较

如果 x 是基本类型,y 是对象,则先把 y.toString(),然后在比较

e) 比较少见的情况
`[]==![]` //true ![]=>false =>false == []=> true

以下两个原则可以让我们有效地避免出错:
如果两边的值中有 true 或者 false,千万不要使用 ==
如果两边的值中有 []、’’或者 0,尽量不要使用 ==
最好使用 === 来避免不经意的强制类型转换。这两个原则可以让我们避免几乎所有强制类型转换的坑。

正文完
 0