js中有两组关于相等的操作符,第一组是等于和不等于,他们在比较之前先执行转换;第二组是全等和不全等,他们比较前不执行转换。

等于和不等于

  • 等于:==
  • 不等于:!=

这两个操作符都会先进行类型转换(强制类型转换)再确认操作数是否是相等。

在其转换时会遵循如下规则:

  • 如有操作数为布尔值,则会将其转换为数值在进行比较。false为0,true为1。
  • 若一个操作数是字符串,另一个操作数是数值,则会尝试将字符串转换为数值再比较。
  • 若一个操作数是对象,另一个不是,则会使用valueOf()方法获取其原始值,然后再根据前面的方法来比较。

在比较是遵循如下规则:

  • null和undefined相等
  • null和undefined不会转换为其他类型的值再进行对比
  • 如果有任意操作数为NaN,则比较都会是不想等。即使两个操作数都是NaN,相等操作符也是false,按照规则,NaN不等于NaN。
  • 如果两个操作数都是对象,则比较它们是不是同一个对象,如果都是指向同一个对象,则相等操作符返回true。

全等和不全等

  • 全等:===
  • 不全等:!==

这组操作符就是严格运算符,会严格的比较两者的类型和数值。

  • 两数类型不同就会直接返回false。
  • 相同类型时将两数的原始类型的值进行比较。
  • 若是同一类的复合类型值(对象、数组、函数)则比较是否指向同一对象。
  • undefined和null相比较不全等。

总结

相等运算符因为存在类型转换的问题,也许使用==可以一定程度上减少代码量,在编程协作时可能会影响协作效率,在看到==时还要再去考虑两数是否存在类型转换的问题,而用明确的===不容易造成不必要的麻烦成本。

因此平时使用时最好使用===来判断两数是否相等。

(当然用了eslint之类的也会提示最好使用===的233)