框架和业务中的区别-简单理解
一个普通的函数,传入两个参数,查看是否有变化,有返回true
,没有返回false
在普通业务中,我们可能这样写就可以完成了
export function hasChanged(x, y) {
return x!==y;
}
但如果在框架中,我们需要考虑各种不同场景,来看下面的代码
export function hasChanged(x, y) {
if (x === y) {
return x === 0 && 1 / x !== 1 / y
}else {
return x === x || y === y
}
}
如果 x === y
就证明相同,没有变化,那为什么要返回下面一大串不直接返回 false
呢?
有没有可能,两个东西相等但它是不同的东西
有,0! ,如+0 === -0
,但 +0
和 -0
是两个东西,如下
为什么+0
和-0
不一样呢?因为运算特点不同,1/+0 = Infinity
,1/-0 = -Infinity
正无穷 Infinity 负无穷 -Infinity
所以我们在第一个if判断返回时加上了x === 0 && 1 / x !== 1 / y
这样的判断,即x 为 0,如果x是+0,y是-0,那就后面的判断就成立,返回就是true表示有变化
我们接下来的else判断返回也是一样的理解,为什么x !== y
不直接返回true呢?
有没有可能两个东西不相等,但它是同一个东西呢?
有,NaN!,如NaN === NaN
它是false
所以在else判断返回时,让 x 和 y 自身比较来排除了NaN的情况
最后,官方是有注意到这种情况的,所以提供了Object.is()
方法来进行判断
所以我们的函数就可以改为如下
export function hasChanged(x, y) {
return !Object.is(x,y);
}
通过这个简单的例子,可以想想在平时写代码时有没有什么没有考虑到的,希望对你有所帮助!