==
、===
和 Object.is()
1、区别
==
两边值类型不同的时候,先进行类型转换,在比较===
不进行类型转换,直接值比较Object.is(val1, val2)
判断两个值是否为同一值
2、==
类型转换是怎么转换的?
- 如果类型不同,进行类型转换
- 判断比较的是否是
null
或者是undefined
,如果是,返回true
- 判断类型是否为
string
或者number
,如果是,将string
转换为number
- 判断其中一方是否为
boolean
,如果是,将其中一方转为number
在进行判断 - 判断其中一方是否为
object
,且另外一方是string
、number
、symbol
,如果是,将object
转为原始类型进行判断(valueOf()
方法) - 如果有一个是
NaN
,则直接返回false
- 如果两个都是对象,则比较是否指向同一个对象
3、[] == ![]
的值为什么?
答案:为 true
转换步骤
- ! 运算符优先级最高,
![]
会被转换为false
,因此此时为[] == false
- 根据第四条,其中一方为
boolean
,把boolean
转为number
,所以此时为[] == 0
- 再根据第五条,把数组
[]
转为原始类型,调用数组的toString()
方法,[].toString() = ''
,所以此时为'' == 0
- 再根据第三条,把
string
转为number
,''
转为number
为 0,所以此时0 == 0
- 两边数据类型相同
0 == 0
,为true
4、Object.is() 判断两值相等的情况
不会进行强制类型转换
- 都是
undefined
- 都是
null
- 都是
true
或false
- 都是相同长度的字符串且相同字符按相同顺序排列
- 都是相同对象(意味着每个对象有同一个引用)
- 都是数字且
- 都是
+0
- 都是
-0
- 都是
NaN
- 或都是非零而且非
NaN
且为同一个值
- 都是