在JS中,判断数据是否变动,并不是一件容易的事。
在 Vue 中,判断数据是否变动的函数源码如下:
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is#polyfill
export function hasChanged(x: unknown, y: unknown): boolean {
if (x === y) {
return x === 0 && 1 / x !== 1 / (y as number)
} else {
return x === x || y === y
}
}
即便 x === y
了,也不能说数据没有变动,还需要进一步判断 —— 这是为了处理 +0
和 -0
. 表面上看+0
和 -0
没有区别,但是 1/+0
不等于 1/-0
, 因此数据从 +0
变为 -0
,Vue 需要重新计算依赖, 这里 hasChanged
必须返回 true
.
即便 x !== y
, 也不能说数据变动了 —— 这是因为在JS中 NaN
不等于 NaN
。
可以看出,框架开发者,要处理很多边界情况,这时候就要对语言特性有更深入的了解。
网友评论