javascript 隐式转换 == 之 [ ]==![ ] 结果为true,而{ }==!{ } 结果为false

Posted jny1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 隐式转换 == 之 [ ]==![ ] 结果为true,而{ }==!{ } 结果为false相关的知识,希望对你有一定的参考价值。

 技术图片

技术图片

ECMAScript中的隐式转换 == 会先将两边转换成相似的类型,再执行比较;

①、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
②、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
③、如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较,如果对象没有valueOf()方法,则调用 toString();

顺便提一下,valueOf() 方法可返回 Boolean 对象的原始值。[ ] 和 都是属于引用类型,js变量存储有栈存储和堆存储,基本数据类型的变量存储在栈中,引用数据类型的变量存储在堆中,引用类型数据的地址存在栈中,当访问基础类型变量时,直接从栈中取值。当访问引用类型变量时,先从栈中读取地址,在根据地址到堆中取出数据;

 现在看看 [ ]==![ ] 的结果为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;

对于 ==! 也是同理的,关键在于 .toString() --> 结果为NaN, NaN==0 --> false;

那么同理,

对于 [ ]==! 结果为true; ==![ ] 接果为false 就很容易理解了。

以上是关于javascript 隐式转换 == 之 [ ]==![ ] 结果为true,而{ }==!{ } 结果为false的主要内容,如果未能解决你的问题,请参考以下文章

深入详解函数的柯里化

有趣的JavaScript隐式类型转换

JavaScript的数据类型的隐式转换

[2016-02-08][javascript][数据类型的隐式转换]

javascript隐式转换详解

javascript教程隐式类型转换如何操作