JS学习笔记——Object.is到底是何物

Object.is() 方法确定两个值是否是相同的值。

1、Object.is的背景

ES5比较两个值是否相等,只有两个运算符:相等运算符(==)严格相等运算符(===)。他们都有缺点,前者自动转换数据类型后者NaN不等于自身以及+0等于-0。JavaScript缺乏一种运算,在所有环境中,只要两个值是一样的,他们就应该相等。

ES6提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。

2、Object.is的用法

Object.is(value1, value2)
参数:

value1 : 需要比较的第一个值。
value2 : 需要比较的第二个值。

返回值:

一个 布尔值,指示两个参数是否相同的。

例子
Object.is('foo', 'foo')
// true
Object.is({}, {})
// false

3、Object.is的相同情况

Object.is() 会在下面这些情况下认为两个值是相同的:

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且(如下)
  • 都是正零 +0
    都是负零 -0
    都是 NaN
    都是除零和 NaN 外的其它同一个数字
    

这种相等性判断逻辑和传统的 == 运算符所用的不同,== 运算符会对它两边的操作数做隐式的类型转换(如果它们是不同类型的值的话),然后才进行相等性比较,(所以才会有类似 “” == false 为 true 的现象),但Object.is 不会做这种类型转换

当然,严格相等运算符 === 不会对操作数进行类型转换,但是它会把 -0 和 +0 这两个数值视为相同的,还会把两个 NaN 看成是不相等的。

+0 === -0 //true
NaN === NaN // false

Object.is(+0, -0) // false
Object.is(NaN, NaN) // true

4、Object.is的实现

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
});
上一篇:Java 中的 NaN


下一篇:JavaScript中三个等号和两个等号的区别(== 和 ===)浅析