雄辩的JavaScript 4.4深度比较

雄辩的JavaScript 4.4深度比较,javascript,object,Javascript,Object,我正试着教自己一些JavaScript 我正在练习4.4深度比较。 我已经编写了自己的代码,通过了所有的测试,甚至我自己做的一些测试,但是当我检查解决方案时,它与我所做的完全不同 有没有人能告诉我,我的代码是否产生了与解决方案相同的结果,或者有没有人能告诉我,即使我的代码与解决方案完全不同,如何判断我的代码是否正确,不仅是针对这个实践问题,而且是针对未来的问题 我只是害怕有一个错误的想法,并没有意识到,因为我的代码工作 问题是: 编写一个函数deepEqual,该函数接受两个值,并且仅当它们是相

我正试着教自己一些JavaScript

我正在练习4.4深度比较。 我已经编写了自己的代码,通过了所有的测试,甚至我自己做的一些测试,但是当我检查解决方案时,它与我所做的完全不同

有没有人能告诉我,我的代码是否产生了与解决方案相同的结果,或者有没有人能告诉我,即使我的代码与解决方案完全不同,如何判断我的代码是否正确,不仅是针对这个实践问题,而且是针对未来的问题

我只是害怕有一个错误的想法,并没有意识到,因为我的代码工作

问题是:

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

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

我的代码是:

function deepEqual(val1, val2) {
  if(typeof val1 !== typeof val2) return false;
  else if(typeof val1 !== "object") return val1 === val2;
  for(var event in val1){
    return deepEqual(val1[event], val2[event]);
  }
}
解决办法是:

function deepEqual2(a, b) {
  if (a === b) return true;
  
  if (a == null || typeof a != "object" ||
      b == null || typeof b != "object")
    return false;
  
  var propsInA = 0, propsInB = 0;

  for (var prop in a)
    propsInA += 1;

  for (var prop in b) {
    propsInB += 1;
    if (!(prop in a) || !deepEqual(a[prop], b[prop]))
      return false;
  }

  return propsInA == propsInB;
}

提前谢谢

您的代码有几个问题:

  • 您只测试对象中的第一个属性,因为在
    for in
    循环中有一个
    return
    。因此,在比较对象时,代码所做的只是检查第一个属性

  • 如果在循环后保留一个标志并返回结果,它仍然会有一个问题,即它只检查
    a
    中的属性;如果
    b
    有一个
    a
    没有的属性怎么办


  • 谢谢!检查我的代码以尽可能多地找出可能的情况的唯一方法是什么??我不想每次试图解决一些实践问题时都问我是否有正确的代码…@user2099177:这两者的结合,从逻辑上思考你的代码在做什么,并在调试器中逐步检查代码以确保它在做你认为它在做的事情。:-)