判断JS相等的3中方式:
1.宽松相等 ==
2.严格相等 ===
3.ES6新增的 Object.is()
三者在比较方面的区别:
宽松相等:
在宽松相等中,在进行比较时候,会经过以下几个步骤(类型的隐式转化):
-
首先进行判断
类型
是否相同,如果相同,则直接进行比较,如果不相同,则进入下一步。 -
判断是不是
null
与undefined
,如果是,则直接返回true
,如果不是,进入下一步 -
判断是不是
String
与Number
,如果是,则将String
转化为Number
后进行比较,如果不是则进入下一步 -
判断是不是
Boolean
与其他类型
,如果是,则将Boolean
转化为Number
后进行比较,如果不相等进入下一步 -
判断是否为对象与非对象,如果是,为对象的一方则会调用对象的
valueOf()
方法,调用完valueOf()
方法后,若还是对象,则调用toString()
,如果还为非对象,抛出错误,转化完之后,若是不相等,则进行下一步- valueOf()返回值对照表
1. Array: 数组本身 2. Boolean: 布尔值 3. Date: 毫秒数 4. Function: 函数本身 5. Number: 数字值 6. Object: 对象本身 7. String: 字符串值
- toString()方法不太好描述,建议读者去MDN上搜索此方法
- valueOf()返回值对照表
-
若是对象与对象,则直接判断
指向地址
是否相同,若相同,则相等,若不相同则不等
-
`注:每次类型转化后,都会重新从条件1开始进行再次判断`
宽松相等的例子:
-
[] == 0
- 满足上述条件5,[]为对象,则执行
valueOf()
,返回的是数组本身,继续执行toString()
,返回值为''
空字符串 - 等式变为
'' == 0
,符合条件3的要求,则将''
空字符串转化为数字,Number('') = 0
, - 等式变为
0 == 0
,符合条件1,类型相等,则直接比较,返回true
- 满足上述条件5,[]为对象,则执行
-
[] == true
- 满足条件4,则先将
Boolean
值转化为数字 - 等式变为 [] == 1,满足等式5,执行
valueOf()
方法,返回的是数组本身,则继续执行toString()
方法,返回的是''
- 等式变为
'' == 1
,满足条件3,则将''
转化为Number类型, 0 == 1
,返回false
- 满足条件4,则先将
-
[4,5] == '4,5'
- 满足条件5,执行
vaueOf()
方法,返回数组本身,则继续调用toString()
方法,返回'4,5' - 等式变为
'4,5' == '4,5
',满足条件1,直接进行比较。返回true
- 满足条件5,执行
-
严格相等:
- 严格相等在进行判断的时候,不会进行类型的隐式转化,也就是说,在严格模式下,
'0' === 0
为false
- 在严格相等下,存在两个特殊的情况,那就是
-0 === +0
为true
以及NaN === NaN
为false
- 严格相等在进行判断的时候,不会进行类型的隐式转化,也就是说,在严格模式下,
-
Objcet.is():
Objcet.is()
基本与严格相等类似,并且对严格相等中的
-0 === +0
以及NaN === NaN
进行了更正,- 在
Objcet.is()
中-0 === +0
为false
以及NaN === NaN
为true