深度比较JavaScript函数

深度比较JavaScript函数,javascript,eloquent,equals,Javascript,Eloquent,Equals,我正在阅读第三版的Elount JavaScript,虽然我已经看到了一到两个不同的答案,所以在执行逻辑上与我的几乎相同,但无论我怎么看,我的工作似乎都不一样 目标:创建一个深度比较函数,该函数可以比较两个对象,并根据它们的属性确定它们是否是同一类型对象(相同的键和值)的不同实例,而不考虑引用 有人能发现我代码中的错误吗 function deepEqual(a,b){ if((typeof a=='object'&& a!=null)&&(typeof b=

我正在阅读第三版的Elount JavaScript,虽然我已经看到了一到两个不同的答案,所以在执行逻辑上与我的几乎相同,但无论我怎么看,我的工作似乎都不一样

目标:创建一个深度比较函数,该函数可以比较两个对象,并根据它们的属性确定它们是否是同一类型对象(相同的键和值)的不同实例,而不考虑引用

有人能发现我代码中的错误吗

function deepEqual(a,b){
  if((typeof a=='object'&& a!=null)&&(typeof b=='object'&& b!=null)){
   if(Object.keys(a).length != Object.keys(b).length){return false}    
    for(let key in a){
        if(a[key]==b[key]){
          if(!deepEqual(a[key],b[key])){return false}
        }else{
          return false
        }
    }
   return true
  }else if(a!==b){return false}

  else{return true}
}

var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true (reads true currently)
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false (reads false currently)
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true (reads false currently)

看起来您只需要调整for循环逻辑来捕捉这样的对象(使用您自己的逻辑):

你可以在这里玩这个:

错误就在这里:

if (a[key] == b[key])
如果它们是对象,即使它们“相等”,条件也可能返回false

函数深度相等(a,b){
if(a&&b&&typeof a=='object'&&typeof b=='object'){
if(Object.keys(a).length!=Object.keys(b).length)返回false;
如果(!deepEqual(a[key],b[key])返回false,则为(a中的var key);
返回true;
}否则返回a==b
}
var obj={here:{is:“},对象:[2]};
控制台日志(deepEqual(obj,obj));
// → 符合事实的
log(deepEqual(obj,{here:1,object:2}));
// → 错误的
log(deepEqual(obj,{here:{is:“an”},对象:[2]}));

// → true
这是因为相等运算符查看的是它们在内存中的位置,而不是它们是相似的对象吗?如果这个问题很愚蠢,我很抱歉。我想我理解了运营商的mdn文档,但它似乎不是lol…@user16801,是的,这就像比较两个硬币。两者都是1美分,但它们是不同的硬币。
if (a[key] == b[key])