¶介绍
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.indexOf
Array.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,因此可以忽略。