咔~

导航

== 和 === 的区别!!!

[] == ![] // is true

上面的判断为什么会是true?

先看下 == 跟 ===

== 是先转换类型再比较相等

=== 是只比较大小不转换类型

对于 == 来说,如果对比双方的类型不一样的话,就会进行类型转换

简单来说的顺序就是:

  1. 首先会判断两者类型是否相同。相同的话就是比大小了
  2. 类型不相同的话,那么就会进行类型转换
  3. 会先判断是否在对比 null 和 undefined,是的话就会返回 true
  4. 判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number
  5. 判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断
  6. 判断其中一方是否为 object 且另一方为 stringnumber 或者 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

posted on 2019-02-19 14:32  咔~  阅读(473)  评论(0编辑  收藏  举报