==其实没有那么简单

发布时间:2019-01-03 作者:一点通


用来比较两个值是否相等,==在我们平时的开发中是经常用到的,但是这里面不满了各种神坑,随便列举一个

[] == []   // false
[] == ![]  //  true

是不是有点反人类?要理解这样的结果,我们必须要知道==的工作原理。JavaScript有值类型和引用类型两种,那么也就会出现下面3种比较情况:

两个值类型比较

转换成相同数据类型的值进行“数据等值”比较

两个引用类型比较

比较引用地址

比如上面的[] == []这俩对象的引用地址不一样,所以必定为false

值类型与引用类型进行比较

将引用类型的数据转换成为与值类型数据相同的数据,再进行“数据等值”比较。

比如[] == ![],我们着重分析一下。

1、这里!的优先级更高先执行,![]false,所以等价于[] == false

2、左侧的[]为对象,操作符会尝试在[]上执行方法valueOftoString,那么[].toString()等于空字符串"",最终表达式变成了"" == false

3、两个不同类型的值类型进行比较,需要转换成相同的值类型。如果其中一个值类型为布尔值,那么布尔操作数如果为true,会转换成1,如果为false,会转换为0,也就是"" == 0

4、当比较数字和字符串时,字符串会转换成数字值,即Number("")等于0,所以最终是比较0 == 0,自然结果也就是true了。

关于比较运算涉及类型转换的规则会单独出来详细讲,在实际开发中,要谨记一点:永远使用===而不是==,避不了坑就得选条没有坑的路走