对象比较功能,不了解这个例子

时间:2015-09-08 21:20:26

标签: javascript if-statement

以下示例取自Eloquent Javascript第4章末尾的练习。

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;
}

这个功能大部分都很容易让我理解,但有一部分我不确定发生了什么:

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

for循环遍历所提供对象中的属性," b",每次递增propsInB的值,然后我就不会真正遵循为什么if语句'条件就是它们。

我很感激任何解释。

2 个答案:

答案 0 :(得分:1)

正在检查以确保b中找到的属性也是a中的属性,并且两个属性的值都相同。

因此,如果a具有属性“x”和“y”,但b具有属性“y”和“z”,则属性“z”的测试将失败,并且如果a.yb.y不是“非常平等”,则属性“y”失败。

答案 1 :(得分:1)

好的,让我们分析一下......

for (var prop in b) {
    propsInB += 1; // Increment to 
    if ( 
          !(prop in a) ||  // exists in a???
          !deepEqual(a[prop], b[prop])) // !! -> this is the point where recursion is happaning
      return false;
}

这会检查属性是否也存在。

   !(prop in a)  

这是递归发生的地方..

!deepEqual(a[prop], b[prop]))

想象一下递归就像你在文件夹结构中寻找最深的文档:/ home / me / stuff / cool-stuff / games /.../ p>

你不知道结构,但你必须找到最深的文档,你将通过递归来完成。

伪代码:

  goDeeper(folder) {
    childFolders = findAllFolderInFolder(folder);
    if (!childFolders) {
      alert('found the deepest Folder: ' + folder);
      return;
    } else
      childFolders.forEach(goDeeper); // Call goDeeper for each folder in this folder...
  }

  goDeeper('/'); // It will go through all the filesystem, and each time it finds an end it will alert('...');

所以这个伪代码会走进每个文件夹并尝试越来越深......