在js开发中有一个老生常谈的问题,就是== 与 ===的区别,虽然使用频率非常高,但同样出错频率也是同样的高。
虽然说出错频率高,但是大部分情况还是得过且过, == 不行换 ===,更甚的直接放弃==全部无脑使用===,这样做代码不但效率低下而且容易导致代码不稳定,所以弄清楚原理还是很有必要的。
首先明确一下 == 与 ===的命名差异:
-
==相等运算符 -
===严格运算符
由命名上的区别可以看出==只是相等,而===相较于相等应该是更为严格的相等运算。
接下来来看二者之间定义区别:
-
==仅判断数据的值,值相等即为真,类型不同时会将值转换后再比较 -
===优先判断类型,仅在同类型且值也相同才为真
再来看一下两者的运算顺序:
===的运算规则如下:
- 执行
typeof判断值的类型,不同直接返回false - 同一类型的基本类型(
Boolean,String,Number),执行valueof,值相同则返回true - 复合类型比较时(
function,object,array),比较它们是否指向同一对象引用。 -
undefined与null与自身严格相等
null === null //true
undefined === undefined //true
==的运算规则如下:
- 在比较类型同一的数据时,与严格相等规则相同
- 在比较不相同数据时,会先将数据转换成同一类型,然后与严相等规则相同
类型转换的规则:
- 类型不同的基本类型比较时,字符串和布尔值都会转换成数值,然后比较数值是否相等
- 一个值是
string另个是number,会把string转换成number再进行比较 - 一个值是
true,会把它转成1再比较,false会转成0 - 复合类型与基本类型比较,会把复合类型使用
valueof或toString后进行比较
值得注意的是
null与undefined比较时 返回true
一个正常的值与undefined比较时 肯定返回false(特殊情况除外,如str='undefined')
一个正常的值 与null比较时一切皆有可能
看过上面的规则后可以发现:
- 当对比的类型可预测时直接使用
==一般是没有问题的只需要把握好类型的转换规则即可 - 当对比的类型不可预测且只希望已某一指定类型进行比较的时候就必须使用
===来确保程序的严谨
了解了== 与 === 对比时发生了什么以后,灵活的使用它们可以使代码更加的严谨,同时减少一些违反直觉的结果,而不是直接的拒绝使用==,无脑使用===