什么时候会出现 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
阅读 2.9k
3 个回答
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

image.png

image.png


NaN 不等于 null
image.png

When isNaN(a) == true

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题