ES6版本中,四种相等判断的算法:
- 全等: ===
- 等于: ==
- 零值相等: -0 === +0
- 同值相等: -0 !== +0 NaN === NaN
JS中提供有关相等判断的方法
1.严格相等 === Strict Equality
2.非严格(抽象/非约束)相等 == Loose (自由的,不守限制的)Equality
3.Object.is(v1,v2) ES6 ,判断两个参数是否是同一个值
=== 严格相等
不进行隐式类型转换 - 类型相同/值也相同
1 === '1' ? false
1 === 2 ? false
引用值必须是同一个地址
var obj = {} obj === obj ? true {} === {} ? false
两个NaN 或者是NaN和其它值都不相等。
NaN === NaN ? false NaN === undifined ? false
+0 和 -0 相等 : +0 === -0 ? true
+Infinity与-Infinity ? +Infinity === -Infinity ? false
如何定义变量a?a != a ?
a=NaN
== 非严格相等 Abstract Equality
隐式类型转换 - 等式两边都有可能被转换
转换以后还是用严格相等来进行比较
ToPrimitive(A) :是通过 A.toString()和A.valueof()方法,将参数A转换为原始值(primitive)
任何对象都和 null,undefined不相等
例外:
窄对象: Narrow Object ->document.all
typeof document.all // "undefined"
document.all == undefined ? true
全等对结果的预测更加明确清晰,
全等在不进行隐式类型转换的前提下,更快速。
falsy值:
flase, 0 ,+/-0 , ''/""/``, 8n(bigInt),null ,undefined, NaN
同值相等:same-value
零值相等: same-value-zero
-0 !== +0 =>同值相等
NaN === NaN => 同值相等
同值相等的底层实现是 Object.is()
这是ES6中的方法,ES5没有暴露出同值相等的方法。
Object.is()
ES6 ES2015
是同值相等的实现
Object.is()的判断:就是同值相等,不进行类型转换。
-0 !== +0 =>同值相等 NaN === NaN => 同值相等
实现:
参考: