严格相等
为===使用的等值判断方式
类型不同直接返回false
类型相同:
+0与-0相等NaN和NaN不相等undefined与undefined相等null与null相等- 指向同一地址的对象相等
- 顺序相同的字符串相等
使用严格相当的场景
switch case-===indexOflastIndexOf
宽松相等
类型不同则进行类型转换,规则详见js类型转换 todo
类型相同时,除了以下规则外与严格相等相同
document.all与undefined相等document.all与null相等
这其实不符合ES规范,ES规范所有对象和原始值都不与undefined和null相等,这更像是浏览器BUG,但是也没人进行这个比较吧?
只用于==
同值相等
Api中的只用于Object.is,多用于语言内部
NaN与NaN相等+0和-0不相等
存在的意义:
js
Object.defineProperty(Number, "NEGATIVE_ZERO", {
value: -0,
writable: false,
configurable: false,
enumerable: false,
});
function attemptMutation(v) {
Object.defineProperty(Number, "NEGATIVE_ZERO", { value: v });
}
attemptMutation(-0)//不报错
attemptMutation(0)//报错
如上代码,当规定了一个不可变属性,此时需要严格判断+0和-0,当然也需要判断NaN,主观上这样更加合理
当语言期望一个值等于另外一个值的时候,几乎所有地方都是用同值相等。
可以借助以上例子理解语言内部的含义
零值相等
与同值相等的区别是:+0和-0相等
不作为Api公开
用于:
- 数组的
includes map的键值判断set的判断
注意点
当任何需要等值判断的时候,可以对其用的什么类型等值判断敏感一些,这样可能能避免一些问题