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

  1. 如果2个值的类型相同,就仅比较它们是否相等。
    特殊情况:

       NaN不等于NaN
       +0等于-0
    
  2. 对象的宽松相等==,两个对象指向同一个值时,即视为相等,不发生强制类型转换。

  3. ==在比较两个不同类型的值时会发生隐式强制类型转换,会将其中之一或两者都转换为相同的类型后在进行比较。
    a) 字符串和数字之间的相等比较
    如果x是数字,y是字符串,则返回x == ToNumber(y)
    如果x是字符串,y是数字,则返回ToNumber(x) == y

    b) 其他类型和布尔类型之间的相等比较
    如果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,尽量不要使用==
最好使用===来避免不经意的强制类型转换。这两个原则可以让我们避免几乎所有强制类型转换的坑。

大煜儿
103 声望7 粉丝

用心走路,给每一个细节打一个结。


« 上一篇
json
下一篇 »
DOM盒模型