JavaScript 中 == 是怎么进行比较的?==、=== 和 Object.is() 三者又有什么区别?

245 阅读1分钟

=====Object.is()

1、区别

  • == 两边值类型不同的时候,先进行类型转换,在比较
  • === 不进行类型转换,直接值比较
  • Object.is(val1, val2) 判断两个值是否为同一值

2、== 类型转换是怎么转换的?

  1. 如果类型不同,进行类型转换
  2. 判断比较的是否是 null 或者是 undefined,如果是,返回 true
  3. 判断类型是否为 string 或者 number,如果是,将 string 转换为 number
  4. 判断其中一方是否为 boolean,如果是,将其中一方转为 number 在进行判断
  5. 判断其中一方是否为 object,且另外一方是 stringnumbersymbol,如果是,将 object 转为原始类型进行判断(valueOf() 方法)
  6. 如果有一个是 NaN,则直接返回 false
  7. 如果两个都是对象,则比较是否指向同一个对象 ==比较

3、[] == ![] 的值为什么?

答案:为 true

转换步骤

  1. ! 运算符优先级最高,![] 会被转换为 false,因此此时为 [] == false
  2. 根据第四条,其中一方为 boolean,把 boolean 转为 number,所以此时为 [] == 0
  3. 再根据第五条,把数组 [] 转为原始类型,调用数组的 toString() 方法,[].toString() = '',所以此时为 '' == 0
  4. 再根据第三条,把 string 转为 number'' 转为 number 为 0,所以此时 0 == 0
  5. 两边数据类型相同 0 == 0,为 true

4、Object.is() 判断两值相等的情况

不会进行强制类型转换

  • 都是 undefined
  • 都是 null
  • 都是 truefalse
  • 都是相同长度的字符串且相同字符按相同顺序排列
  • 都是相同对象(意味着每个对象有同一个引用)
  • 都是数字且
    • 都是 +0
    • 都是 -0
    • 都是 NaN
    • 或都是非零而且非 NaN 且为同一个值