deepEqual函数应该包含2个值,看它们是否完全相同。第一次和第二次测试的结果按预期返回。我加入递归调用的方式可能有问题吗?
function deepEqual(obj1, obj2) {
if (typeof obj1 == 'object' && typeof obj1 !== null && typeof obj2 == 'object' && typeof obj2 !== null) {
if (obj1.length != obj2.length) {return false;}
for (var prop in obj1) {
if (typeof obj1[prop] == 'object') {deepEqual(obj1[prop], obj2[prop]);}
if (obj1[prop] != obj2[prop]) {return false;}
}
return true;
} else if (obj1 === obj2) {return true;}
else {return false;}
}
var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true -> true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false -> false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true -> false
答案 0 :(得分:6)
我加入递归调用的方式可能有问题吗?
是的,你丢掉了它的返回值。你应该检查它的返回值,如果它是假的,早点返回false
。
if (typeof obj1[prop] == 'object') {
if (!deepEqual(obj1[prop], obj2[prop])) {
return false;
}
}
旁注:该代码中还有其他几个问题。我不打算对其进行全面审核,但是,例如,if
跟随上面测试obj1[prop]
的行,看看它是否真的应该成为else if
{1}},例如:
if (typeof obj1[prop] == 'object') {
if (!deepEqual(obj1[prop], obj2[prop])) {
return false;
}
} else if (obj1[prop] != obj2[prop]) {
//^^^^------------------------------------------ here
return false;
}