雄辩的Javascript(4.4深度比较)

雄辩的Javascript(4.4深度比较),javascript,Javascript,我试图解决以下问题: 编写一个函数deepEqual,该函数接受两个值,并且仅当它们是相同的值或具有相同属性的对象,并且与对deepEqual的递归调用相比,它们的值也相等时才返回true 要确定是通过标识(使用===运算符)还是通过查看它们的属性来比较两个对象,可以使用typeof运算符。如果它为这两个值生成“object”,则应该进行深入比较。但你必须考虑一个愚蠢的例外:历史上的一次偶然,typeof null也会产生“object” 我的代码如下: var obj = {here: {is

我试图解决以下问题:

编写一个函数deepEqual,该函数接受两个值,并且仅当它们是相同的值或具有相同属性的对象,并且与对deepEqual的递归调用相比,它们的值也相等时才返回true

要确定是通过标识(使用===运算符)还是通过查看它们的属性来比较两个对象,可以使用typeof运算符。如果它为这两个值生成“object”,则应该进行深入比较。但你必须考虑一个愚蠢的例外:历史上的一次偶然,typeof null也会产生“object”

我的代码如下:

var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, {here: {is: "an"}, object: 55}));

function deepEqual(obj1, obj2){
  if (obj1===obj2) {return true;}
  else if(obj1===null || obj2=== null ){return false;}
  else{
    if(typeof(obj1)==="object" || typeof(obj2)==="object"){
      for ( var key in obj1 ) {
          //console.log(obj1[key]);
          //console.log(obj2[key]);
          //console.log("compares:"+obj1[key]+" with "+obj2[key]);
          return JSON.stringify(obj1[key])===JSON.stringify(obj2[key]);
      };
    }
  }
}

我应该是错的(因为值2和55不同),但我是真的。知道为什么吗?谢谢。

之所以为真,是因为在比较对象中的第一个键之后立即返回值

您的代码做了一个小改动:

var obj={
在这里:{
是:“安”
},
对象:2
};
控制台日志(“falsy测试:”+deepEqual(obj{
在这里:{
是:“安”
},
对象:55
}));
console.log(“真实测试:”+deepEqual(obj{
在这里:{
是:“安”
},
对象:2
}));
功能相等(obj1、obj2){
var结果=假;
如果(obj1==obj2){
返回true;
}else if(obj1==null | | obj2==null){
返回false;
}否则{
if(类型化(obj1)==“对象”| |类型化(obj2)==“对象”){
用于(obj1中的var键){
//console.log(obj1[key]);
//console.log(obj2[key]);
//log(“比较:“+obj1[key]+”和“+obj2[key]);
if(JSON.stringify(obj1[key])==JSON.stringify(obj2[key])){
结果=真;
}否则{
返回false;
}
};
//比较对象中的所有值后返回结果。
返回结果;
}
}

}
您的比较仅在第一次迭代中运行,因为您将立即返回。有什么好方法可以解决它?也许您可以找到一些答案。