灏天阁

Object.is() 详解

· Yin灏

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;
      }
    },
  });
}

- Book Lists -