Javascript 对象比较函数,不理解此示例
以下示例摘自本手册第4章末尾的练习 这个函数的大部分内容对我来说都很容易理解,但有一部分我不太确定发生了什么: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语句的条件是什么了 如果您有任何解释,
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('...');