【问题标题】:Javascript Deep ComparisonJavascript 深度比较
【发布时间】:2016-04-22 02:19:28
【问题描述】:

有人问过关于对象深度比较的问题,我有解决方案。但是解决方案中有一行我不完全理解。

这是solution,这是Ch 4 of Eloquent JS中比较对象的问题。我得到了所有的东西,除了这条线:

    if (!(prop in a) || !deepEqual(a[prop], b[prop]))

它位于底部。这是完整的功能:

function deepEqual(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;
}

if (!(prop in a) 是在比较该索引处“b”中属性的存在,还是比较值?

真的是一样的q。关于下半年,但我知道这是一个不同的答案:!deepEqual(a[prop], b[prop]) 进行什么类型的比较(例如,对或错)?我理解递归,但与我之前的问题一样,这是进行“它存在”比较,还是比较值中的信息?

提前谢谢你。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    According to MDN:

    如果指定的属性在指定的对象中,in 运算符返回true

    Also:

    for...in 语句 以任意顺序迭代对象的enumerable properties。对于每个不同的属性,可以执行语句。

    所以要回答您的第一个问题,prop in a 正在检查对象b 中的字段prop 是否存在于对象a 中。

    为了回答您的第二个问题,deepEqual(a[prop], b[prop]) 正在检查对象 a[prop]b[prop] 是否相等,包括其所有子对象和内容。

    【讨论】:

    • 感谢 caffinatedmonky,(以及其他所有人的帮助)。这就是我的想法,但想确认。我感谢有关“in”的信息。
    • @hikinthru 欢迎使用 stackoverflow。感谢您没有让您的第一篇文章出现语法错误。
    【解决方案2】:

    in 运算符返回 true,如果表达式右侧的对象包含具有表达式左侧字符串值的键。

    例如:如果a 包含与prop 的字符串值同名的键,则prop in a 为真。例如:

    var prop = "age";
    
    var obj1 = {
        name: "Dave",
        age: 21,
        record: { ... }
    };
    var obj2 = {
        name: "John",
        record: { ... }
    };
    
    console.log(prop in obj1); // true
    console.log(prop in obj2); // false
    

    如果prop 设置为"record",则deepEqual(a[prop], b[prop]) 递归比较a.recordb.record 中的

    【讨论】:

      【解决方案3】:

      它正在检查是否存在。它说:“对于 B 中的每个属性,检查 A。如果 A 没有该属性,或者如果 A 上的属性值与 B 上的属性值不完全相等,则返回 false”。

      另一种实现将避免对该行的存在性检查,而是在函数顶部使用if (typeof A == 'undefined') 在每轮递归开始时验证输入参数...乍一看,我认为'会是等效的,但效率较低。当前实现避免了对未定义属性的调用。

      【讨论】:

      • 但是,a = {x:undefined}b = {y:undefined} 会“深度相等”吗?
      • 好问题!显然undefined == undefined 是真的(我不确定它会不会......可能被视为不确定),所以我认为你的问题中的 a 和 b 应该非常相等。不错的收获。
      猜你喜欢
      • 2016-11-18
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多