Object.is介绍及实现

1,094 阅读2分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

Object.is() 方法判断两个值是否为同一个值

语法

// 返回一个 Boolean 类型的值,相等为true,否则为false
Object.is(val1, val2);
  • val1和val2分别为被比较的两个值

存在的意义

Object.is之前,JS中判断两个数据是否相等都是通过非严格相等==和严格相等===进行判断

机制的不同导致其使用的场景也存在一些差异

非严格相等:若是需要进行隐式类型转换的相等比较,使用需谨慎,隐式转换会导致难以排查的问题

严格相等:不进行类型转换,类型不同总是返回false,类型和值都相等时,且类型不为Number类型,则返回true,其存在一些缺陷:+0 === -0返回trueNaN === NaN返回false

Object.is:在严格相等的基础之上,增加了正负零和NaN的判断,+0 === -0返回falseNaN === NaN返回true

规则

参数都是undefinednulltruefalse

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

将上述情况带入函数,得到符合期望的结果