比较两个对象,看是否相等

Mun*_*lam 8 javascript

目前我正在关注一本书并且非常困惑,并且多次尝试了解以下代码.我的第一个困惑实际上是接近比较两个对象ab的问题.

 function deepEqual(a, b) {
  if (a === b) return true;

  if (a == null || typeof a != "object" ||
      b == null || typeof b != "object")
    return false;

  var propsInA = 0, propsInB = 0;

  for (var prop in a)
    propsInA += 1;

  for (var prop in b) {
    propsInB += 1;
    if (!(prop in a) || !deepEqual(a[prop], b[prop]))
      return false;
  }

  return propsInA == propsInB;
}

var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// ? true
console.log(deepEqual(obj, {here: 1, object: 2}));
// ? false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// ? true
Run Code Online (Sandbox Code Playgroud)

Frx*_*rem 3

function deepEqual(a, b) {
  if (a === b) return true;
Run Code Online (Sandbox Code Playgroud)

首先,我们检查ab是否严格相等(意思是“指的是完全相同的事物”)。大多数事物,例如字符串和数字,如果它们相等,就会通过此测试;对象是例外,因为两个“相同”的对象不一定是同一个对象(它们可以只是看起来相同)。

  if (a == null || typeof a != "object" ||
      b == null || typeof b != "object")
    return false;
Run Code Online (Sandbox Code Playgroud)

然后我们说,如果两者中的任何一个都不是对象,并且它们没有通过最后一次测试,那么它们不可能是相同的。同样,这里的对象是例外,因此剩余的代码将处理ab都是对象的情况。

  var propsInA = 0, propsInB = 0;

  for (var prop in a)
    propsInA += 1;
Run Code Online (Sandbox Code Playgroud)

这段代码只是简单地计算 的属性数量a

  for (var prop in b) {
    propsInB += 1;
    if (!(prop in a) || !deepEqual(a[prop], b[prop]))
      return false;
  }
Run Code Online (Sandbox Code Playgroud)

此代码获取 中的每个属性b,并检查是否a包含具有相同值的相同属性。如果a不具有b具有的属性,或者它们不同,则这两个对象不能相等。

  return propsInA == propsInB;
}
Run Code Online (Sandbox Code Playgroud)

最后,如果ab不具有相同数量的属性,则它们不能相等。但是,如果它们确实具有相同数量的属性,则ab必须相等,因为a具有 的所有属性b并且只有那些