【React】什么时候会出现 a !== a.valueOf() 呢
function valueOf(obj) {return obj.valueOf ? obj.valueOf() : Object.prototype.valueOf.call(obj);
}
function valueEqual(a, b) {
// Test for strict equality first.
if (a === b) return true;
// Otherwise, if either of them == null they are not equal.
if (a == null || b == null) return false;
if (Array.isArray(a)) {
return (
Array.isArray(b) &&
a.length === b.length &&
a.every(function(item, index) {
return valueEqual(item, b[index]);
})
);
}
if (typeof a === 'object' || typeof b === 'object') {
var aValue = valueOf(a);
var bValue = valueOf(b);
// 没有明白这里什么时候会不相等
if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);
return Object.keys(Object.assign({}, a, b)).every(function(key) {
return valueEqual(a[key], b[key]);
});
}
return false;
}
在研究 history
库时,看到引用了一个value-equal
的库,这里在判断 object
是否相等的时候,使用 if (aValue !== a || bValue !== b)
, 我没有明白什么情况下,会有 一个值不等于他的 valueOf
的值,上述判断为什么会在有一个判断是 Object
的时候,但仍然会重新进入 valueEqual
方法进行重新判断
这里我们先不讨论手动复写原型上的 valueOf
这种情况
汇总下所有的 a 不等于 a.valueOf() 的情况如下
- NaN.valueOf()为 NaN,而NaN!==NaN
Date对象,valueOf为时间毫秒数
new Date(), (new Date()).valueOf() // `2020-04-28T03:17:50.299Z 1588043870299`
string, number, boolean 使用 new 的时候,也是不等于的
new String(1) !== (new String(1)).valueOf() // true
回答
var p = new Date();console.log('p!==p.valueOf() ',p!==p.valueOf());
这个取决于不同类型的对象对valueOf函数的处理方式:
- 对与数值,字符串,boolean,valueOf就取其原始值
- null就报错了,不存在valueOf函数
- NaN,valueOf()为NaN,而NaN!==NaN
- Date对象,valueOf为时间毫秒数
- 其它对象ValueOf()就是对象自己了
那当然是 NaN
NaN
不等于 null
When isNaN(a) == true
以上是 【React】什么时候会出现 a !== a.valueOf() 呢 的全部内容, 来源链接: utcz.com/a/72488.html