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转换为1;
2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()和toString()方法,用得到的基本类型值再按照前面的规则进行比较;
不说了,自己也没有多少墨水,把自己也说晕了
想看看学没学会,你自己玩一玩下面这几个
{}==true
{}=="0"
!{}==false
[]=="0"
![]=="0"
NaN==false
NaN==true
!NaN