ECMAScript中的隐式转换 == 会先将两边转换成类似的类型,再执行比较;对象
①、若是有一个操做数是布尔值,则在比较相等性以前先将其转换为数值——false转换为0,而true转换为1;
②、若是一个操做数是字符串,另外一个操做数是数值,在比较相等性以前先将字符串转换为数值
③、若是一个操做数是对象,另外一个操做数不是,则调用对象的valueOf()方法,用获得的基本类型值按照前面的规则进行比较,若是对象没有valueOf()方法,则调用 toString();blog
顺便提一下,valueOf() 方法可返回 Boolean 对象的原始值。[ ] 和 { } 都是属于引用类型,js变量存储有栈存储和堆存储,基本数据类型的变量存储在栈中,引用数据类型的变量存储在堆中,引用类型数据的地址存在栈中,当访问基础类型变量时,直接从栈中取值。当访问引用类型变量时,先从栈中读取地址,在根据地址到堆中取出数据;ip
如今看看 [ ]==![ ] 的结果为true:字符串
(1)根据运算符优先级 ,! 的优先级是大于 == 的,因此先会执行 ![ ] ;!可将变量转换成boolean类型,null、undefined、NaN以及空字符串('')取反都为true,其他都为false。因此 ! [ ] 运算后的结果就是 false,也就是 [ ] == ! [ ] 至关于 [ ] == false;基础
(2)根据上面的规则① ,[ ] ==![ ]至关于 [ ] == 0;变量
(3)根据上面的规则③,[ ].toString() = ' ' (空字符串);数据类型
(4)根据上面的规则②,空字符串转为数值为0,因此 [ ] == ![ ] 至关于 0=0,结果为true。引用
总结一下:方法
[ ] ==![ ] --> [ ] == false --> [ ] ==0 --> ' ' == 0 --> 0==0 --> true;im
对于{ } ==!{ }也是同理的,关键在于{ }.toString() --> 结果为NaN, NaN==0 --> false;
那么同理,
对于 [ ]==!{ } 结果为true;{ }==![ ] 接果为false 就很容易理解了。