[]==0和![]==0

82 阅读2分钟

JS的隐式转换

先看结果

[]==0   true
![]==0  true

只想看结果,就不用往下看了,第一次写文章结束 ^^


为什么啊?不知道,前几分钟我还不知道。

   转换规则是这样的
        
       左边是对象,在"=="比较时,会发生隐式转换,转换为原始值😍
       
       空数组会这样 [].valueOf().toString()   变成了 ""
       空对象会这样 ({}).valueOf().toString()   变成了 "[Object Object]"
        
       嘿嘿,都变成了字符串
       
       所以第一个答案变成了   ""== 0   

此时类型仍然不同还需要隐式转换才能比较

字符串 "" 隐式转换为数字 0 输出结果true 😍


知道这个规则 并且知道!的优先级高于==就会分析第二个了

引用类型的值转换为布尔值为true

Boolean([])===true   Boolean({})===true

而!运算符会将其转换为false
![]===false   !{}===false  

然后是false==0进行转换,将false转换为数字0,输出结果true 😍

你有没有想过

打表情的地方,为什么是我说的那样,数字比布尔值高贵一点?原始值比对象高贵一点?数字比字符串高贵一点?

因为遵循这样一个的规则(没错他们确实高贵一点,所以我们要变成他们

1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为12. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;

3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()和toString()方法,用得到的基本类型值再按照前面的规则进行比较;

不说了,自己也没有多少墨水,把自己也说晕了

想看看学没学会,你自己玩一玩下面这几个

{}==true
{}=="0"
!{}==false
[]=="0"
![]=="0"
NaN==false
NaN==true
!NaN