有人可以引导我浏览此代码中的递归函数吗?!deepEqual(a[key], b[key])
。每次调用时如何比较其值?...
function deepEqual(a, b) {
if (a === b) return true;
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") return false;
let keysA = Object.keys(a), keysB = Object.keys(b);
if (keysA.length != keysB.length) return false;
for (let i = 0; i <= keysA.length -1; i++) {
let key = keysA[i];
if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
}
return true;
}
let obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: {is: "as"}, object: 3}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true
我真的需要了解递归函数循环如何通过第二次调用,而不会在第一次检查时返回true,而在第二次检查时返回false
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") return false;
由于!deepEqual(a["is"], b["is"]))
== !deepEqual("is", "is"))
的值,因此应该在对true;
的第一次检查中返回if (a === b) return true;
。并在第二次检查false;
时返回if (a == null || typeof a != "object" || b == null || typeof b != "object") return false;
,因为它不是对象。
不会阻止该功能完成对 剩余的财产?
有人能对我说清楚吗?
let obj = {here: {is: "an", that: "at", name: "ola", here: {is: "as"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: {is: "an", that: "at", name: "ola", here: {is: "as"}, object: 3}));
// → false
//The only different property value is in the second argument's last property.
答案 0 :(得分:1)
这非常简单,让我们使用问题中的示例遍历这段代码。
console.log(deepEqual(obj,obj));
在上述情况下,您正在比较同一个对象,该对象又指向相同的内存位置,因此 if(a === b)返回true; 被执行并返回true。
console.log(deepEqual(obj,{此处:{是:“ as”},对象:3})))
在此示例中,由于您要比较两个不同的对象,即不同的存储位置,因此
console.log(deepEqual(obj,{此处:{是:“一个”},对象:2})))
为此,第二个示例中的所有步骤都以与第六个步骤中购买相同的方式执行。 a [“ object”] == b [“ object”] 被执行,因此您得到了真
希望这会清除所有步骤。