# 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" == 1011==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

# 二、if( )里面的条件判断。

  • 五种类型才会判定为 false:0、""、 NaN 、 undefined 、null[ ]和{}都会判定为true
  • 有趣的是,判定为 false 都是基本类型,而在非严格模式下,undefined == null,所以只算是四种。
Last Updated: 6/3/2024, 1:08:34 AM