“ 昨天说了对象转基本类型的文章介绍之后,今天我们继续来探讨相关话题。”
在讲解之前大家需要记住一个规则:
(1)如果一个操作数是字符串,另一个操作数是数值,在比较相等之前先将字符串转化为数值;
(2)如果有其中一个操作数是布尔值,则在比较相等之前先将其转换为数值;
(3)至于其中有一个操作数为对象时,有兴趣的小伙伴可以看看我之前的一篇关于对象类型转基础类型的文章。
首先先公布答案:true。what?可能此时你会大吃一惊,为什么是这样的,也可能你答案是对的,但是解析的思路还有问题。下面我就来说说具体解析的思路:
(1)首先我们需要知道优先级是谁,在这里如果忽略优先级来解析得出的结论是有问题的,在这里!的优先级是比==优先级高的。因此![]会优先执行,此时进行一个取反操作,![]得到的值是false;
(2)此时比较变为[] == false
的比较了,按照上面的规则,其中有一个操作数为布尔值,那么在比较相等之前会将false转化为数值0;
(3)这个时候比较又变为[] == 0
,这个时候其中一个操作数是对象,那么抓变过程就是我之前写的文章中提到过的步骤,在这里我就不说为什么这样转变了,不懂的小伙伴可以先去看看对象转基本类型那篇文章之后再来看这里。
(4)紧接着(3),由于0是数值,那么[]数组会先调用valueOf()方法返回的值[]数组对象,由于[]数组对象不是基本类型,接着它会去调用toString()方法返回空字符串’’;
(5)这个时候比较变为'' == 0
,又根据上面定义的规则1(如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转化为数值),此时空字符串’’转变为数字0(即Number(‘’));
(6)最后比较变为0 == 0
,那么肯定就返回true了。
在解析第一部分之后,接下来我们再继续讲解一下{} == !{}
的结果值是什么。我就不卖关子了,答案是false。此时你会不会又一个what?
解析步骤:
(1)首先由于!优先级高,那么还是会优先转换!{},!进行一个取反操作返回false;
(2)这个时候比较转变为{} == false
,按照上面的规则其中有一个操作数为布尔值,那么在比较相等之前会将false转化为数值0;
(3)此时比较转变为{} == 0
,这个时候其中一个操作数是对象,由于0是数值,那么{}对象会先调用valueOf()方法返回对象{},由于对象不是基本数据类型,那么此时会接着调用toString()方法,得到返回值字符串”[object Object]”;
(4)比较变为"[object Object]" == 0
,根据上面定义的规则1(如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转化为数值),此时”[object Object]”转化为数字NaN(即调用Number(“[object Object]”));
(5)最后比较变为NaN == 0
,NaN连自身都不想等,更不要说其他值了,最终返回false。
如果你认为该文章对你有帮助的话,不妨来个三连再走。