严格相等
为===
使用的等值判断方式
类型不同直接返回false
类型相同:
+0
与-0
相等NaN
和NaN
不相等undefined
与undefined
相等null
与null
相等- 指向同一地址的对象相等
- 顺序相同的字符串相等
使用严格相当的场景
switch case
-===
indexOf
lastIndexOf
宽松相等
类型不同则进行类型转换,规则详见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
的判断
注意点
当任何需要等值判断的时候,可以对其用的什么类型等值判断敏感一些,这样可能能避免一些问题