【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() 的情况如下

  1. NaN.valueOf()为 NaN,而NaN!==NaN
  2. Date对象,valueOf为时间毫秒数

    new Date(), (new Date()).valueOf() // `2020-04-28T03:17:50.299Z 1588043870299`

  3. 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函数的处理方式:

  1. 对与数值,字符串,boolean,valueOf就取其原始值
  2. null就报错了,不存在valueOf函数
  3. NaN,valueOf()为NaN,而NaN!==NaN
  4. Date对象,valueOf为时间毫秒数
  5. 其它对象ValueOf()就是对象自己了

那当然是 NaN

【React】什么时候会出现 a !== a.valueOf() 呢

【React】什么时候会出现 a !== a.valueOf() 呢


NaN 不等于 null
【React】什么时候会出现 a !== a.valueOf() 呢

When isNaN(a) == true

以上是 【React】什么时候会出现 a !== a.valueOf() 呢 的全部内容, 来源链接: utcz.com/a/72488.html

回到顶部