for循环中的递归函数未完成

时间:2016-09-18 22:09:06

标签: javascript recursion

我不能让我的for循环继续在我的对象中的第一个属性之后工作。这是第4章中Eloquent JavaScript的一个问题:

  

编写一个函数deepEqual,它接受两个值并返回true   只有它们是相同的值或具有相同的对象   与递归相比,其值也相等的属性   打电话给deepEqual。

     

要确定是否按身份比较两件事(使用===   操作员)或通过查看他们的属性,你可以使用   typeof运算符。如果它为两个值产生“对象”,你应该   做一个深刻的比较。但你必须把一个愚蠢的例外   帐户:由于历史事故,typeof null也会产生“对象”。

这是我的代码:

function deepEqual(obj1, obj2) {
  if ((typeof obj1 === 'object' && obj1 != null) && (typeof obj2 === 'object' && obj2 != null)) {
    for (var property in obj1) {
      if (property in obj2) {
        return deepEqual(obj1[property], obj2[property])
      } else {
        return false;
      }
    }
  } else if (obj1 !== obj2) {
    return false;
  } else {
    return true;
  }
}

var obj = {object: 3, here: 1};
var obj2 = {object: 3, here: 2};

console.log(deepEqual(obj, obj2));

控制台返回true,因为'here'属性不相等,所以它应该为false。在查看输出时,这是因为函数中的'for in loop'在第一个属性之后退出。请帮助我解释为什么它不会继续循环。

1 个答案:

答案 0 :(得分:0)

你的for循环无法超越第一个属性,因为当你调用deepEqual时你退出了函数

 for (var property in obj1) {
      if (property in obj2) {
        // returning means no more looping....
        return deepEqual(obj1[property], obj2[property])
      } 

如果deepEqual返回相等的值,则要继续循环,如果错误则返回。