直接说出问题segmentfault
!![] == true //结果是true [] == true //结果是false ![] == [] //结果是true
为何会出现这种状况spa
首先说一下,若是你看到这些代码,能想到 相等运算符(== ),两个操做数类型不一样时,进行的转换,那么你已经接近答案了。 .net
不要浪费时间,咱们须要先知道在JavaScript中的一些比较特别的类型转换,最好能记住哦!!!code
[] 转为字符串是 "" // String([]) 返回"" [] 转为数字是 0 // Number([]) 返回0 [] 转为布尔值是 true // Boolean([]) 返回true true 转为数字是 1 // Number(true) 返回1 false 转为数字是 0 // Number(false) 返回0
若是想知道为何,请点这里。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法 对象
咱们一句一句的看 blog
!![] == true //结果是true
! (逻辑非),会将操做数的布尔值求反,而!! 就是类型转换,将对应的类型转换为boolean型
因此咱们看一看,[ ]一次求反 (![]) 返回的就是false,再求反(!![]) 返回的就是true。
最后的比较就变成 true == true 天然结果是 true ip
[]==true //结果是false
这里咱们重点说说,相等运算符(==) 在遇到两个操做数类型不一样的时候,要遵照的规则和类型转换
一、若是-个值是null, 另外一个是undefined,则它们相等 null == undefined //返回true
二、若是一个值是数字,另外一个是字符串,先将字符串转换为数字,而后使用转换后的值进行比较。rem
1 == "1" //1==1 //结果是true 2 == "1" //2==1 //结果是false
三、若是其中一个值是true,则将其转换为1再进行比较。若是其中一个值是false,则将其转换为0再进行比较。字符串
"1" == true //1==1 结果是true 0 == false //0==0 结果是true
四、若是一个值是对象,另外一个值是数字或字符串,则将对象转换为原始值,而后再进行比较。对象经过toString()
方法或者valueOf()
方法转换为原始值,JavaScript语言核心的内置类先尝试使用valueOf()
,再尝试使用toString()
,除了日期类,日期类只能使用toString()
转换,那些不是JavaScript语言核心中的对象则经过各自的实现中定义的方法转换为原始值。get
原始值:不可变动的值,包括undefined、null、布尔值、数字、和字符串。
全部的对象都有toString()
和 valueOf()
这两个方法。 toString()
方法的做用是,返回一个反映这个对象的字符串。 valueOf()
方法的做用是,一个对象那个若是存在任意原始值,它就默认将对象转换为表示它的原始值。
五、其余不一样类型之间的比较均不相等。
好的,咱们知道这些规则后,再来看行代码 []==true //结果是false
true 会转为1
[ ] 会转为 0
最后是比较的是 0 == 1,因此结果是false
理解了上面的内容的话,那么 ![] == [] //结果是true
这行代码,也就好理解了
![ ] ,也就是 [] 先转为 布尔值(true),而后求反,就是false,false 转为数字就是0
[ ]转为数字就是0
最后就是 0 == 0 ,因此结果就是true
强调一点,[ ] 转数字 是0,转布尔值,是true,可是这不是说, 0 转为布尔值是true,而是false,是false,false。
这篇文章主要是说一些关于隐式转换的事。
根据上面的三行代码,还能写出一些其余的来,看看下面这些有趣的代码吧。
[] == 0 //返回结果是 true ![] == 0 //返回结果是 true [] == '' //返回结果是 true !![] == '' //返回结果是 false '' == true //返回结果是 false
文章不长主要是想说清楚,最开始提到的问题。
最后推荐两篇相关的文章,但愿对你们有所帮助。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法
简单说 经过JS的隐式转换,关键时刻救你一命