「前端每日一问(8)」Object.is 和 === 有什么区别?

391 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

本题难度:⭐

难度评级最高五星,最低一星。

答:

Object.is 方法用来对比两个值是否相等。传入两个参数,返回一个布尔值。

该方法修复了 === 在一些特殊情况下的错误判断,比如 +0 和 -0 ,NaN 和 NaN。

0 === -0     // true  按照常理应该为 false
NaN === NaN  // false 按照常理应该为 true
// 用 Object.is
Object.is(0, -0)    // false
Object.is(NaN, NaN) // true

兼容性挺不错的,除了 ie 浏览器都支持,现在这年头,祝看到这篇文章的同学永远不兼容 ie 浏览器。

image.png

Polyfill

从 Polyfill 来分析一下,Object.is 是如何解决 === 的问题的。

if (!Object.is) {
  Object.defineProperty(Object, 'is', {
    value: function (x, y) {
      if (x === y) {
        // x 为 0,y 为 -0,程序走到了这里
        // 1/+0 = +Infinity, 1/-0 = -Infinity, 返回 +Infinity === -Infinity,为 false
        return x !== 0 || 1 / x === 1 / y
      } else {
        // x 和 y 都为 NaN,程序就走到了这里
        // 返回 NaN !== NaN && NaN !== NaN,为 true
        return x !== x && y !== y
      }
    }
  })
}

与本题相关问题:

「前端每日一问(6)」== 和 ===有什么区别,分别在什么情况使用?

结尾

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(7)」JavaScript中有哪些数据类型?

下一篇:

「前端每日一问(9)」0.1 + 0.2 为什么不等于 0.3?如何解决?