从各种资源中自学 JS,包括Eloquent Javascript一书。在第 4 章的问题集中,问题 4 提出
编写一个函数 deepEqual,它接受两个值,并且只有当它们是相同的值或者是具有相同属性的对象时,与对 deepEqual 的递归调用相比,它们的值也相等时才返回 true。
要确定是通过身份比较两个事物(使用 === 运算符)还是通过查看它们的属性,可以使用 typeof 运算符。如果它为两个值都生成“对象”,则应该进行深入比较。但是您必须考虑一个愚蠢的例外:由于历史事故,typeof null 也会产生“对象”。
我已经这样做了,并使用 pythonTutor 分析给定的解决方案和不同的测试用例,以更好地理解该方法。我的问题与以下代码中的变量propInA和propInB有关:
function deepEqual (a,b) {
if (a===b) return true;
else if (a === null || b === null || typeof a !== "object" || typeof b !== "object") return false;
else {
let propInA = 0, propInB = 0
for (var prop in a) {
**propInA** +=1;
}
for (prop in b) {
**propInB** +=1;
if (!(**propInA**) || !deepEqual(a[prop], b[prop])) return false;
} return **propInA** == **propInB**;
}
}
console.log(deepEqual({here: {is: "an"}, object: 2, guy: 47}, {here: {is: "an"}, object: 2}));
// → false
据我了解,这些变量用作计数器,因此当我在此代码底部运行测试用例时,第一个参数中的附加属性(“guy”)会导致两个对象之间的属性数量不等,并且因此 deepEqual 返回 false。
如果是这种情况,!(propInA)的函数是什么,在函数被递归调用的“if...”语句中?
if (!(**propInA**) || !deepEqual(a[prop], b[prop])) return false;
由于这个变量的值是数字,它本质上不是在问“如果 3 不是真的,那么调用递归函数......”?我在这里想念什么?