"2019-01-11 回答 使用 == 或 === 对两个不同却具有相同属性及属性值的对象进行比较,他们的结果却不会相等。这是因为等号比较的是他们的引用(内存地址),而不是基本类型。 为了测试两个对象在结构上是否相等,需要一个辅助函数。 他将遍历每个对象的所有属性,然后测试他们是否具有相同的值,嵌套对象也需如此。当然, .."

JavaScript 中如何对比两个对象?

2019-01-11

回答

使用 ===== 对两个不同却具有相同属性及属性值的对象进行比较,他们的结果却不会相等。这是因为等号比较的是他们的引用(内存地址),而不是基本类型。

为了测试两个对象在结构上是否相等,需要一个辅助函数。 他将遍历每个对象的所有属性,然后测试他们是否具有相同的值,嵌套对象也需如此。当然,也可以使用参数来控制是否对原型链进行比较。

注意:此代码只对普通对象、数组、函数、日期和基本类型的数据结构进行对比。

function isDeepEqual(obj1, obj2, testPrototypes = false) {
  if (obj1 === obj2) {
    return true
  }

  if (typeof obj1 === "function" && typeof obj2 === "function") {
    return obj1.toString() === obj2.toString()
  }

  if (obj1 instanceof Date && obj2 instanceof Date) {
    return obj1.getTime() === obj2.getTime()
  }

  if (
    Object.prototype.toString.call(obj1) !==
      Object.prototype.toString.call(obj2) ||
    typeof obj1 !== "object"
  ) {
    return false
  }

  const prototypesAreEqual = testPrototypes
    ? isDeepEqual(
        Object.getPrototypeOf(obj1),
        Object.getPrototypeOf(obj2),
        true
      )
    : true

  const obj1Props = Object.getOwnPropertyNames(obj1)
  const obj2Props = Object.getOwnPropertyNames(obj2)

  return (
    obj1Props.length === obj2Props.length &&
    prototypesAreEqual &&
    obj1Props.every(prop => isDeepEqual(obj1[prop], obj2[prop]))
  )
}

加分回答

const obj1 = {
    name: "Benjamin",
    sex : "male"
};
const obj2 = {
    name: "Benjamin",
    sex : "male"
};
const obj3 = obj1;
console.log(obj1 === obj3); // true

返回总目录

每天 30 秒

  • 30Seconds

    前端面试 30s 系列问答翻译:

    英文原文请看 30-seconds-of-interviews

    97 引用 • 176 回帖 • 5 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    303 引用 • 966 回帖 • 1013 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    200 引用 • 1136 回帖 • 481 关注
感谢    关注    收藏    赞同    反对    举报    分享
回帖    
请输入回帖内容...