判断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