在 玉伯 的文章 《一道大题目,嘿嘿》 中有这样一段代码:
[] == ![]
也许很多同学迷惑:咦,这个如何转换呢?
首先,我们了解下逻辑 NOT(!)运算与等号(==)运算的一些基本规则:
- 逻辑 NOT 运算中,如果运算数是对象,返回 fasle;
- 等号运算中,如果一个运算数是 Boolean 值,在运算前,会将其转换成数字:false -> 0,true -> 1;
- 等号运算中,如果一个运算数是对象,另一个是数字,在运算前,会将对象转换成数字。
2010年11月2日补充:对象不能直接转换成数字型,可以将其转换成字符型,再将字符型转换成数字型。
根据上面的一些规则,我们再来看看原来的表达式如何演变:
Step01: [] == ![] // 由于[]是对象,则 ![] 返回fasle,演变为 Step02。
Step02: [] == fasle // 由于 fasle 是 Boolean 值,则转换成数字 0,演变为 Step03。
Step03: [] == 0 // 由于 0是数字,[]是对象,[] 转换成数字 Number([]) -> 0,[] 转换成字符型 [].toString() -> "","" 再转换成数字型 -> 0 ,演变为 Step04。
Step04: 0 == 0 // 返回最终结果:true
思考题:
{} == ! {}; //返回什么值?
[] == [] //返回什么值?
PS:如果你对玉伯的题目很感兴趣,推荐阅读: