对于循环递归函数没有完成
问题描述:
我无法让我的循环继续工作后,我的对象的第一个属性。这是从雄辩的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循环”在第一个属性之后退出。请帮助我为什么它不会继续循环。
答
您的循环,因为您返回该功能的,当你调用deepEqual
for (var property in obj1) {
if (property in obj2) {
// returning means no more looping....
return deepEqual(obj1[property], obj2[property])
}
要进行循环,如果deepEqual
返回其相等,或者如果返回不能超越第一属性的假。
感谢您的评论!你的回答是有道理的,我通过用'if(!deepEqual(obj1 [property],obj2 [property]))来代替返回值来工作“) return false;'。 – runandrew