这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
Object.is()方法判断两个值是否为同一个值
语法
// 返回一个 Boolean 类型的值,相等为true,否则为false
Object.is(val1, val2);
- val1和val2分别为被比较的两个值
存在的意义
在Object.is之前,JS中判断两个数据是否相等都是通过非严格相等==和严格相等===进行判断
机制的不同导致其使用的场景也存在一些差异
非严格相等:若是需要进行隐式类型转换的相等比较,使用需谨慎,隐式转换会导致难以排查的问题
严格相等:不进行类型转换,类型不同总是返回false,类型和值都相等时,且类型不为Number类型,则返回true,其存在一些缺陷:+0 === -0返回true,NaN === NaN返回false
Object.is:在严格相等的基础之上,增加了正负零和NaN的判断,+0 === -0返回false,NaN === NaN返回true
规则
参数都是undefined、null、true、false时
Object.is(undefined, undefined); // true
同一个引用地址的对象
const o1 = {};
const o2 = o1;
const bol = Object.is(o1, o2); // true
number类型处理
Object.is(+0, -0); // false
Object.is(0, -0); // false
Object.is(+0, 0); // true
Object.is(NaN, NaN); // true
实现
先上代码,核心注释在代码中
const is = (val1, val2) => {
if (val1 === val2) {
// 处理 +0 === -0
return x !== 0 || 1 / x === 1 / y;
}else {
// 处理NaN,利用NaN !== NaN 的特型
return x !== x && y !== y
}
};
代码很好,对于首次接触的小伙伴需要好好的梳理和理解一下
首先看一下对于NaN的处理,处理NaN的是建立在val1 !== val2的基础之上,若是传入的是两个不同的数据且存在不为NaN的数据时,那么x !== x恒等为false,那么is函数最终返回false,若是都为NaN时,在JS中有且仅有NaN !== NaN返回true
看一下对于+0 === -0的处理逻辑,由于在严格相等中+0 === -0返回的是true,因为进入if逻辑中包含前述情况,由于Object.is属于对严格相等的功能补全,进入此逻辑中的其他情况都会返回true,因此return逻辑主要是处理+0、-0
再看下严格限等的判断
+0 !== 0 // false
-0 !== 0 // false
1 / +0 // Infinity
1 / -1 // -Infinity
Infinity === -Infinity // false
将上述情况带入函数,得到符合期望的结果