==、=== 和 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且为同一个值
- 都是