Object.is()详解
2024-04-09 23:00:22  阅读数 1028

ES5判断两个值是否相等,有两种方法:相等运算符(==)和严格相等运算符(===)。这两种方法都有缺点,前者会自动转换数据类型,后者判断NaN不等于自身,+0 等于 -0

ES6新出了Object.is方法解决这个问题。如果满足以下任意条件则两个值相等:

  • 都是 undefined

  • 都是 null

  • 都是 true 或都是 false

  • 都是相同长度、相同字符、按相同顺序排列的字符串

  • 都是相同对象(意味着都是同一个对象的值引用)

  • 都是数字且

    • 都是 +0

    • 都是 -0

    • 都是NaN

    • 都是同一个值,非零且都不是NaN

它与与严格相等运算符(===)基本一致,不会进行强制类型转换,不同之处只有两个:一是+0不等于-0,二是NaN等于自身。

Polyfill

if (!Object.is) {
  Object.defineProperty(Object, "is", {
    value: function (x, y) {
      // SameValue algorithm
      if (x === y) {
        // 针对+0 不等于 -0的情况
        return x !== 0 || 1 / x === 1 / y;
      } else {
        // 针对NaN的情况
        return x !== x && y !== y;
      }
    }
  });
}