相等判断分类
- 严格比较
- 宽松比较
- SameValue
- SameValueZero
严格比较
- 不会进行隐式类型转换
- 类型相同且值也相同
- NaN与NaN相比为false
- +0与-0比较为true
宽松比较
- 相同类型比较
- 如果是引用类型,则需要比较引用地址是否一样
- 基本类型,直接比较值是否相同,需要注意NaN始终不等于NaN,+0等于-0
- Symbol类型,两个比较的数需要引用相同的symbol才能相等
- 不同类型比较
- null == undefined 会返回true
- 一个对象和基本类型比较,会将对象转为原始值后进行比较
- 一个Symbol和其他类型比较,返回false
- Boolean和其他比较,Boolean会转为Number:true转为1,false转为0
- String和Number比较,会将String转为Number,如果转换失败,会得到NaN,这样结果肯定是false
- 所有原始类型和对象都不与undefined和null宽松相等
SameValue
同值相等,相对于严格比较:NaN与NaN是相等的,+0与-0不相等
Object.is()内部使用的就是同值比较
SameValueZero
相对于SameValue,只有一点不一样:+0与-0相等
没有开放的api使用这个方式,但是在一些api内部使用的就是这样的模式