为什么[]==[]的结果为false,而[]==![]的结果为true

上一篇文章==和===有什么区别?,我们学习了=====的区别,明白了==的一个工作原理。这一篇文章我们主要来分析下为什么[]==![]的结果为true

我们先在谷歌浏览器控制台打印看下结果,如下图:

接下来我们来分析下为什么会有这样的结果:

首先,[]==[]结果为false,这个比较简单,两个引用类型的比较,比较的是引用地址[]==[]这俩对象的引用地址不一样,所以必定为false

我们着重分析下[]==![]

  1. 根据运算符的优先级,!的优先级是大于==的,所以会先执行![]

!可将变量转换为boolean类型,nullundefinedNaN以及空字符串取反都为true,其余都为false

所以![]运算后的结果是false,也就是[]==![]相当于[]==false

  1. 上一篇文章我们提到:判断其中一方是否为boolean,是的话就会把boolean转换为number再进行判断(false转换为0,true转换为1

也就是表达式变成了[]==0

  1. 判断其中一方是否为object,另一方为string、number、或symbol,是的话就会把object转换为原始类型再进行判断

如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值再进行比较,如果对象没有valueOf()方法,则调用 toString()。

对于空数组,[].toString()返回的是空字符串"",我们在控制台打印看下:

所以,现在表达式就变成了""==0了。

  1. 判断两者类型是否为string和number,是的话就将字符串转换为number

这里,Number("")返回的是0,同样我们再控制台打印看下:

所以最终的表达式就变成了0==0了,自然结果也就是true了。

总结

比较过程如下:

[]==![] -> []==false -> []==0 -> ""==0 -> 0==0

那么对于{}==!{},也是同理的。

关键在于:{}.toString()返回的是NaN

根据上一篇文章我们分析的:如果有其中一方是NaN,则相等操作符返回false,而不相等操作符返回true

{}==!{}的最终表达式为:

{}==!{} -> {}==false -> {}==0 -> NaN==0 -> false

所以{}==!{}的结果为false

最后

好了,本文完,感谢您的阅读,如果文中有不当的地方,欢迎指正,感谢~