Fork me on GitHub

关于Object.is的polyfill理解

 在翻看react-redux源码中的一段工具函数代码时候,对其中的逻辑有一丝迷惑,后科学上网一波得到了我想要的答案。本文是一篇关于Object.is=====的逻辑梳理。

  react-redux库的浅层比较文件(shallowEqual.js)内的工具方法is其实就是现在ES6的Object.is方法的polyfill实现,在MDN上我们也可以看到对应的算法描述。

  根据上述算法,我们可以发现其实=====对值的判断主要有三点不准确的:

  1⃣️:在==情景下,发生了隐式转化;

  2⃣️:在===情景下,+0-0比较返回了true

  3⃣️:在===情景下,NANNAN比较返回了false

  综上,我们要做到完全判断是否相同(对象引用地址指向相同),做如下实现即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (!Object.is) {
Object.is = function(x, y) {
// 全等比较,可以确认大部分情景的值相等
if (x === y) {
// 对于 +0 和 -0 的判断
// 确认x为+0 or -0 后通过 +Infinity !== -Infinity来做差异比对
return x !== 0 || 1 / x === 1 / y;
} else {
// 对于 NAN 的判断
return x !== x && y !== y;
}
};
}