ECMAScript 三种严格相等判断语义

2023/12/20

介绍

ECMAScript 有三种严格(即不会执行类型转换)相等判断的语义,分别是:

对于这三种语义,它们都会对类型不同的值返回 false;对于非数字类型的值,都会执行 SameValueNonNumber 语义;而对于数字类型,它们的差别在于比较 NaN、+0 与 -0 有不同:

使用之处

下面是三种语义所被使用到的常见地方:

SameValue

SameValueZero

IsStrictEqual

如何区分?

笔者根据规律想到一个辅助记忆办法:

  1. ===indexOf/lastIndexOf 都是 ECMAScript 中很早就存在的,对于这类「古老」的都使用 IsStrictEqual 语义;
  2. includesMap/Set 是 ES2015 及更晚才出现的,对于这类「新兴」的使用 SameValueZero 语义;
  3. 虽然 Object.is 也是新的,但它可以被认为有别于 === 的存在,所以特殊处理(Jest 等测试框架对于 toBe 断言就是使用 Object.is 去判断);
  4. WeakMap 的 key 与 WeakSet 不允许是 primitive type,因此可以忽略。