javascript - 比较两个对象看是否相等

标签 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

最佳答案

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

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

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

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

  var propsInA = 0, propsInB = 0;

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

这段代码只是计算a的属性数量。

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

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

  return propsInA == propsInB;
}

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

关于javascript - 比较两个对象看是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37930303/

相关文章:

javascript - 正则表达式:仅字母数字但如果这是纯数字则不是

javascript - 通过删除不需要的嵌套对象属性来过滤对象数组

javascript - jQuery无限滚动缺少CSS背景加载量页面

javascript - 如何将 Ajax 调用包含为外部文件?

javascript - 任何视频播放器都无法使用临时视频源文件寻找视频

javascript - 开 Jest : test that an array contains none of these values?

javascript - 放入外部 js 文件时 QuerySelectorAll 不起作用

javascript - 在 gmail Ui 中添加小部件/控件,例如回旋镖/条纹

javascript检查css是否显示div

javascript - 何时在 javascript/jQuery 中使用 "$"