Javascript:深度比较

zen*_*chi 6 javascript object-comparison

我正在检查这个问题Javascript深度比较 问题提问者的解决方案没有说服我所以我试图分析问题并提出了

var obj = {here: 2};
console.log(deepEqual(obj, obj));
// ? true
console.log(deepEqual(obj, {here: 1}));
// ? false
console.log(deepEqual(obj, {here: 2}));
// ? true
function deepEqual(a,b)
{
  if( (typeof a == 'object' && a != null) &&
      (typeof b == 'object' && b != null) )
  {
     var count = [0,0];
     for( var key in a) count[0]++;
     for( var key in b) count[1]++;
     if( count[0]-count[1] != 0) {console.log('1');return false;}
     for( var key in a)
     {
       if(!(key in b) || !deepEqual(a[key],b[key])) {console.log('2');return false;}
     }
     for( var key in b)
     {
       if(!(key in a) || !deepEqual(b[key],a[key])) {console.log('3');return false;}
     }  
  }
  console.log('a:'+a+' b:'+b);
  return a===b;
}
obj === { here:2 }
Run Code Online (Sandbox Code Playgroud)

这段代码在最后一次测试中失败了(console.log(deepEqual(obj,{here:2})))但是如果对象具有相同的密钥和值,尽管在内存中存在不同的实例,但是考虑对象的逻辑并不能说服我.我的"解决方案"是否存在问题,或者错误在于演习的假设?我链接的问题中提到的代码是否有效?

hikinthru忘记提及的资源(http://eloquentjavascript.net/04_data.html#exercise_deep_compare)

Fra*_*Tan 12

"深层平等",这就是你所关注的问题,而"严格平等"是两回事.正如你所说,"深层平等"意味着"平等的钥匙和同等的价值观".对象的"严格相等"意味着"相同的实例".严格的平等意味着深刻的平等,但是对象可以在不严格平等的情况下完全平等.

你的代码效率有点低,因为你只需要一个循环,但如果你检查a === b一个else块并return truefor循环之后它会正常运行.这是因为您应该与原始值(如字符串和数字)分开处理对象.为了清楚起见,我删除了一些日志记录,我试着保持你的风格.

var obj = {here: 2};
console.log(deepEqual(obj, obj));
// ? true
console.log(deepEqual(obj, {here: 1}));
// ? false
console.log(deepEqual(obj, {here: 2}));
// ? true
console.log(obj === { here:2 });
// ? false
function deepEqual(a,b)
{
  if( (typeof a == 'object' && a != null) &&
      (typeof b == 'object' && b != null) )
  {
     var count = [0,0];
     for( var key in a) count[0]++;
     for( var key in b) count[1]++;
     if( count[0]-count[1] != 0) {return false;}
     for( var key in a)
     {
       if(!(key in b) || !deepEqual(a[key],b[key])) {return false;}
     }
     for( var key in b)
     {
       if(!(key in a) || !deepEqual(b[key],a[key])) {return false;}
     }
     return true;
  }
  else
  {
     return a === b;
  }
}
Run Code Online (Sandbox Code Playgroud)