2016-09-18 56 views
1

我无法让我的循环继续工作后,我的对象的第一个属性。这是从雄辩的JavaScript在第4章的一个问题:对于循环递归函数没有完成

写一个函数,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,当它应该说是假的,因为“这里的属性是不相等的。查看输出时,这是因为函数中的“for in循环”在第一个属性之后退出。请帮助我为什么它不会继续循环。

回答

0

您的循环,因为您返回该功能的,当你调用deepEqual

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

要进行循环,如果deepEqual返回其相等,或者如果返回不能超越第一属性的假。

+0

感谢您的评论!你的回答是有道理的,我通过用'if(!deepEqual(obj1 [property],obj2 [property]))来代替返回值来工作“) return false;'。 – runandrew