js中有两组关于相等的操作符,第一组是等于和不等于,他们在比较之前先执行转换;第二组是全等和不全等,他们比较前不执行转换。
等于和不等于
等于:
==
不等于:
!=
这两个操作符都会先进行类型转换(强制类型转换)再确认操作数是否是相等。
在其转换时会遵循如下规则:
- 如有操作数为布尔值,则会将其转换为数值在进行比较。false为0,true为1。
- 若一个操作数是字符串,另一个操作数是数值,则会尝试将字符串转换为数值再比较。
- 若一个操作数是对象,另一个不是,则会使用valueOf()方法获取其原始值,然后再根据前面的方法来比较。
在比较是遵循如下规则:
- null和undefined相等
- null和undefined不会转换为其他类型的值再进行对比
- 如果有任意操作数为NaN,则比较都会是不相等。即使两个操作数都是NaN,相等操作符也是false,按照规则,NaN不等于NaN。
- 如果两个操作数都是对象,则比较它们是不是同一个对象,如果都是指向同一个对象,则相等操作符返回true。
全等和不全等
- 全等:
===
- 不全等:
!==
这组操作符就是严格运算符,会严格的比较两者的类型和数值。
- 两数类型不同就会直接返回false。
- 相同类型时将两数的原始类型的值进行比较。
- 若是同一类的复合类型值(对象、数组、函数)则比较是否指向同一对象。
- undefined和null相比较不全等。
总结
相等运算符因为存在类型转换的问题,也许使用==可以一定程度上减少代码量,在编程协作时可能会影响协作效率,在看到==时还要再去考虑两数是否存在类型转换的问题,而用明确的===不容易造成不必要的麻烦成本。
因此平时使用时最好使用===来判断两数是否相等。
(当然用了eslint之类的也会提示最好使用===的233)