在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 和 ==falsec) 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,尽量不要使用==最好使用===来避免不经意的强制类型转换。这两个原则可以让我们避免几乎所有强制类型转换的坑。