0

从各种资源中自学 JS,包括Eloquent Javascript一书。在第 4 章的问题集中,问题 4 提出

编写一个函数 deepEqual,它接受两个值,并且只有当它们是相同的值或者是具有相同属性的对象时,与对 deepEqual 的递归调用相比,它们的值也相等时才返回 true。

要确定是通过身份比较两个事物(使用 === 运算符)还是通过查看它们的属性,可以使用 typeof 运算符。如果它为两个值都生成“对象”,则应该进行深入比较。但是您必须考虑一个愚蠢的例外:由于历史事故,typeof null 也会产生“对象”。

我已经这样做了,并使用 pythonTutor 分析给定的解决方案和不同的测试用例,以更好地理解该方法。我的问题与以下代码中的变量propInApropInB有关:

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 不是真的,那么调用递归函数......”?我在这里想念什么?

4

1 回答 1

0

在javascript中,0被认为是“假的”,所以它会说propInA是否为假,0,未定义,空等。在这种情况下,它正在检查它是否> 0。

https://developer.mozilla.org/en-US/docs/Glossary/Falsy

于 2016-06-24T16:32:51.603 回答