¶介绍
ECMAScript 有三种严格(即不会执行类型转换)相等判断的语义,分别是:
对于这三种语义,它们都会对类型不同的值返回 false;对于非数字类型的值,都会执行 SameValueNonNumber 语义;而对于数字类型,它们的差别在于比较 NaN、+0 与 -0 有不同:
- SameValue 会视 NaN 与 NaN 为相等,+0 与 -0 不等;
- SameValueZero 会视 NaN 与 NaN 为相等,+0 与 -0 相等;
- IsStrictEqual 会视 NaN 与 NaN 为不等,+0 与 -0 相等。
¶使用之处
下面是三种语义所被使用到的常见地方:
¶SameValue
¶SameValueZero
¶IsStrictEqual
===比较运算符Array.prototype.indexOfArray.prototype.lastIndexOf%TypedArray%.prototype.indexOf%TypedArray%.prototype.lastIndexOf
¶如何区分?
笔者根据规律想到一个辅助记忆办法:
===与indexOf/lastIndexOf都是 ECMAScript 中很早就存在的,对于这类「古老」的都使用 IsStrictEqual 语义;includes与Map/Set是 ES2015 及更晚才出现的,对于这类「新兴」的使用 SameValueZero 语义;- 虽然
Object.is也是新的,但它可以被认为有别于 === 的存在,所以特殊处理(Jest 等测试框架对于toBe断言就是使用Object.is去判断); WeakMap的 key 与WeakSet不允许是 primitive type,因此可以忽略。