# 3.隐式类型转换
# 一、双等号==
# 1.是否有 NaN
首先判断双等号两边是否有 NaN,如果有的话,则一律返回 false。
- NaN 连自身都不相等:
NaN != NaN
# 2.是否有 boolean 值
- 如果有的话则将 true 转化为 1,false 转化为 0。
# 3.null 和 undefined
遇到 null 或者 undefined,则不会进行类型转换,它们相互的比较都返回 true。
- 除此之外,null 和 undefined 跟其他元素比较都是 false。
# 4.有一边是字符串
另外一边分四种情况:
1) 同样是字符串,则直接进行字符串值的比较
2) 是数字,则需要将字符串转化为数字,然后进行比较。如"1" == 1
,011==11
(前置 0 没了)
3) 有布尔类型,则要将布尔类型转化为 0 或者 1,然后进行比较。
- 注意:除了
1==true,0==false
, 其他都和布尔值不同。
4) 对象或者数组类型,则需要调用 toString()或者 valueOf()方法转化成简单类型,然后进行比较
对象转化为简单类型时会优先调用 valueOf 方法,如果可以与简单值进行比较则会直接比较,此时不再调用 toString 方法。
如果调用 valueOf 方法后无法与简单值进行比较,则会再调用 toString 方法,最终得到比对的结果。
但是需要注意的一点是 Date 对象不满足上述的规则,Date 对象的 toString 和 valueOf 方法都是重新定义过的,默认会调用 toString 方法。
如:
[].toString() //得到"" ,""==0。所以[]==0==false=="" 。
//过程可以看作[].toString() => "" => "" == 0 => 0 == false
var a = {},a.toString()
//"[object Object]" 所以{}和其他的基本类型都不相等,甚至{}!={}。
var a= new Date(2021,3,30),var b= new Date(2021,3,30)
//结果: a != b
//其实 [] != [] ,{} !={}。因为引用类型都是栈存放的引用地址。看上去两个相同,但是他们的引用地址不同。
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 二、if( )里面的条件判断。
- 五种类型才会判定为 false:
0、""、 NaN 、 undefined 、null
。[ ]和{}都会判定为true
。 - 有趣的是,判定为 false 都是基本类型,而在非严格模式下,undefined == null,所以只算是四种。