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