我正在自学JavaScript,并且遇到了Eloquent JavaScript的以下问题:


  编写一个函数deepEqual,该函数接受两个值并返回true
  仅当它们具有相同的值或具有相同的对象时
  与递归比较时其值也相等的属性
  调用deepEqual。找出是否比较两件事
  身份(为此使用===运算符)或查看其
  属性,可以使用typeof运算符。如果产生“物体”
  对于这两个值,您应该进行深入比较。但是你必须
  考虑到一个愚蠢的例外:由于历史事故,typeof
  null也产生“对象”。


我的问题:
为什么当console.log(deepEqual(obj, {here: {is: "an"}, object: 2}))a[key]{ is: 'an' }b[key]{ is: 'an' }变为false,而当用!deepEqual(a[key], b[key])替换该代码时为true?

编码:

function deepEqual(a, b){
    if (a === b) {
        return true;
    }
    else if (typeof a== typeof b && !(a===null ||b===null)){
        for(var key in b){
            for(key in a){
                if(! (key in a)){
                    return false;
                }
                else if (a[key] !== b[key]){
                    return false;
                }
                else
                    return true;
            }
        }
    }
  else
      return false;
}

var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));

最佳答案

因为a[key]b[key]都是对象,所以也需要在它们上使用deepEquals

当前,您没有递归调用deepEquals,因此不可能发生。

关于javascript - Javascript-deepEqual比较和递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29381078/

10-11 18:11