Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象比较函数,不理解此示例_Javascript_If Statement - Fatal编程技术网

Javascript 对象比较函数,不理解此示例

Javascript 对象比较函数,不理解此示例,javascript,if-statement,Javascript,If Statement,以下示例摘自本手册第4章末尾的练习 这个函数的大部分内容对我来说都很容易理解,但有一部分我不太确定发生了什么: for (var prop in b) { propsInB += 1; if (!(prop in a) || !deepEqual(a[prop], b[prop])) return false; } for循环遍历所提供对象“b”中的属性,每次递增propsInB的值,然后我就不明白if语句的条件是什么了 如果您有任何解释,

以下示例摘自本手册第4章末尾的练习

这个函数的大部分内容对我来说都很容易理解,但有一部分我不太确定发生了什么:

 for (var prop in b) {
        propsInB += 1;
        if (!(prop in a) || !deepEqual(a[prop], b[prop]))
          return false;
}
for循环遍历所提供对象“b”中的属性,每次递增propsInB的值,然后我就不明白if语句的条件是什么了


如果您有任何解释,我将不胜感激。

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


因此,如果
a
具有属性“x”和“y”,而
b
具有属性“y”和“z”,则属性“z”的测试将失败,如果
a.y
b.y
不“深度相等”,则属性“y”的测试将失败。

好,让我们分析它们

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/

你不知道它的结构,但是你必须找到最深的文档,你可以用递归来实现

伪代码:

  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('...');

因此,此伪代码将进入每个文件夹,并尝试越来越深入。

它正在检查以确保它们具有相同数量的属性。这里的问题是对deepEqual(objA,objB)的递归调用递归意味着它将调用自己直到结束。看看这里:谢谢,这个解释帮助很大。假设“prop”是“for”循环中的迭代项,这是否也会考虑元素的位置?例如,如果我有a.y和b.y属性,但它们在属性列表中不在同一位置,我会得到“不完全相等”,对吗?不,实际上对象中没有位置,只有一个关键点贴图。他们会是一样的。
prop
是字符串形式的键。您可以使用obj['my_key']访问任何对象或数组,您也可以使用如下键:object={“WTF,这是一个非常奇怪的键”:“奇怪的值”}但要回答您的问题,您没有数组中的排序概念。
  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('...');