[] == ![] // is true
上面的判断为什么会是true?
先看下 == 跟 ===
== 是先转换类型再比较相等
=== 是只比较大小不转换类型
对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换。
简单来说的顺序就是:
- 首先会判断两者类型是否相同。相同的话就是比大小了
- 类型不相同的话,那么就会进行类型转换
- 会先判断是否在对比
null
和undefined
,是的话就会返回true
- 判断两者类型是否为
string
和number
,是的话就会将字符串转换为number
- 判断其中一方是否为
boolean
,是的话就会把boolean
转为number
再进行判断 - 判断其中一方是否为
object
且另一方为string
、number
或者symbol
,是的话就会把object
转为原始类型再进行判断
综上所述,再去看上面的操作[] == ![]
1、首先根据运算符优先级 ,! 的优先级是大于 == 的,所以先会执行 ![]
2、其次对于非布尔值的数据,取反运算符会自动将其转成布尔值。规则是,以下六个值取反后为true,其他值取反后都为false。
undefined
null
false
0(包括+0和-0)
NaN
空字符串('')
3、现在变成了[] ==false; 也就是相当于[] == 0;
4、现在看[],[]是object,则需要转换成原始类型。而空数组是没有valueof()的方法的。所以使用tostring();[].tostring() ==> '' //空字符串
5、然后如果遇到字符串则转化成Number类型。然后就出现了Number('') ==> 0 //现在也就是说[] == 0
现在0 == 0 等式成立 则为true;
这时候的全等(===)终于要出场了。
你看相等那个啥傻帽。罗里吧嗦。在我这里,就必须左右两边类型跟数值全相等,不然我就给你false!!!
哈哈哈 这么看来的确是全等要简单很多。在项目中,为了保证代码的严格性,推荐还是用全等(===)作比较,当然 == 也是可以的。但是要注意判断的时候需要判断类型吗?
ok!打完收工。谢谢大家观看!有问题大家可以留言哦~
资料网站:1、掘金小册
2、https://blog.csdn.net/magic_xiang/article/details/83686224