Javascript比较对象中的值

时间:2016-07-18 14:01:23

标签: javascript

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

1 个答案:

答案 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;
}