ES6中对象的扩展里面添加了一个Object.is方法,用于比较两个值是否严格相等。内部计算与 === 行为基本一致。那么我们怎么在不支持这个方法的ES5中实现呢?
首先我们需要搞清楚两点,1:Object.is(+0,-0) // false 2:Object.is(NaN, NaN) // true。
好了那么让我们自己写出这个方法吧,代码如下:
(function() {
Object.defineProperty(Object,'is', {
value: function(value1, value2) {
if(value1 === value2) return value1 !== 0 || 1 / value1 === 1 / value2;
return value1 !== value1 && value2 !== value2;
},
writable: true,
configurable: true,
enumerable: false
})
使用 Object.is(NaN, NaN);
接下来我们说下这里面得判断。 如果value1 === value2的话 我们就需要排除+0 === -0 的情况, 第一步 value1 !== 0排除非0情况,不是0的话直接返回true,如果是0就会接着走1/0 ===1/0,返回true,1/+0 =Infinite, 1/-0=-Infinite 通过这判断+0和-0不相等返回false
判断NaN === NaN,我们知道NaN是不等于它本身的,所以通过value1 !== value1 && value2 !== value2这个逻辑与来判断
})()