隐式转换和 ![] == []

Boolean([])    // true
[] == true     // false
!![] == true   // true 
![] == []      // true

…本来以为理所当然应该这样的问题,原来好复杂。

1.规则

ECMAScript中相等操作符 ==,这种操作符会先转换操作数(隐式转换),然后再比较它们的相等性。

基本转换规则:
① 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为;

② 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;

③ 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较,如果没有valueOf()方法,则调用 toString();

这两个操作符在进行比较时则要遵循下列规则:
① null 和 undefined 是相等的;

② 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值;

③ 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。重要提示:
即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则, NaN 不等于 NaN。
如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,
则相等操作符返回 true;否则,返回 false;

2. ![] == [] 分析

① !优先级最高,先执行 ![]
Boolean([]) = true,所以 ![] == [] 转换为: false == []

② 根据转换规则①:布尔值在比较相等性之前先将其转换为数值
所以 false == [] 转换为 0 == []

③根据转换规则③一个是对象,另一个不是,调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较,如果没有valueOf()方法,则调用 toString()
对于空数组,[].toString() -> ‘’ ,所以 [] == 0 转化为 0 == ‘’

④根据规则②:一个是字符串,另一个是数值,比较之前先将字符串转换为数值
所以 0 == ‘’ 转换为 0 == 0,为true

概括一下:

![] == []    —>   false == []   —>   0 == []    —>    0 == ‘’    —>   0 == 0

3.再写一个 ! ! [] == true

① 先执行一个 ! []
! 会将操作数的布尔值求反,而Boolean([]) = true,所以: ! ! [] —> ! false
② !false显而易见就是 true

4…

几个比较特殊的:

null == undefined  //  true  
undefined == 0     //  false
null == 0          //  false 

NaN == NaN   	   //  false
NaN != NaN         //  true

"5"==5             //  true

true == 1 		   //  true
true == 2 		   //  false

猜你喜欢

转载自blog.csdn.net/q130334/article/details/107827813
今日推荐