Object.is()与双等全等的区别

... 2025-7-10 JavaScript
  • 数据类型
大约 2 分钟

# 双等 ==

相等操作符,如果两个操作数相等,则返回 true。

若两个操作数的数据类型不相同时,会将两边的操作数转换为相同类型。

参看==操作符的强制类型转换规则

# 全等 ===

全等操作符,除了在比较之前不转换操作数的类型之外,全等操作符和相等操作符没有什么区别。

全等操作符由===表示,它只在两个操作数未经转换就相等的情况下返回 true。

null == undefined 会返回 true,因为它们是 类似的值,null === undefined 会返回 false,因为它们是不同类型的值。

# Object.is()

ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。

他们都有缺点,前者会自动转换数据类型,后者的 NaN 不等于自身,以及+0 等于-0。

JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,他们就应该相等。

ES6 提出“Same-value equality”(同值相等)算法,用来解决这个问题。

Object.is 就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致

但和 ===有两处不同的地方:

  • +0 不等于-0

  • NaN 等于自身

// +0等于-0。
//NaN不等于自身。
;+0 === -0 // true
NaN === NaN // false

// +0不等于-0。
//NaN等于自身。
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
1
2
3
4
5
6
7
8
9

ES5 可以通过下面的代码,部署 Object.is。

Object.defineProperty(Object, 'is', {
  value: function (x, y) {
    if (x === y) {
      // 针对+0 不等于 -0的情况
      return x !== 0 || 1 / x === 1 / y
    }
    // 针对NaN的情况
    return x !== x && y !== y
  },
  configurable: true,
  enumerable: false,
  writable: true,
})
1
2
3
4
5
6
7
8
9
10
11
12
13

# 总结

Object.is()与==运算不同之处在于==需要做类型转化,但是 Object.is()不需要做类型转化。

Object.is()与===运算不同之处在于,在===下,+0 和-0 相同,NaN 和 NaN 不同,在 Object.is()下,+0 和-0 不相同,NaN 和 NaN 相同。

上次编辑于: 2025年7月10日 04:01
贡献者: HugStars