以下示例取自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语句'条件就是它们。
我很感激任何解释。
答案 0 :(得分:1)
正在检查以确保b
中找到的属性也是a
中的属性,并且两个属性的值都相同。
因此,如果a
具有属性“x”和“y”,但b
具有属性“y”和“z”,则属性“z”的测试将失败,并且如果a.y
和b.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('...');
所以这个伪代码会走进每个文件夹并尝试越来越深......