在JS中如何判断两个对象是否相等

在JavaScript中,判断两个对象是否相等有多种方法,取决于你对 相等 的定义以及对象属性的类型。以下是几种常见的方法:

 

1. 严格相等运算符 (===)

使用 === 运算符可以比较两个对象是否引用同一个对象。如果两个变量引用了同一个对象,则它们是相等的,否则它们是不相等的。例如:

const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;

console.log(obj1 === obj2); // false
console.log(obj1 === obj3); // true

在上面的例子中, obj1 和 obj2 的属性值相同,但它们是不同的对象,因此它们的 === 比较返回 false 。而 obj1 和 obj3 引用了同一个对象,它们是相等的,因此 obj1 === obj3 返回 true 。

这里就是严格比较,引用地址和属性名属性值都要一一对应。

 

 

 

2. 对象属性的比较

如果你只是需要比较两个对象的属性是否相等(不比较引用地址),你可以使用循环或 Object.keys 方法来获取对象属性的列表,并比较它们的值。例如:

function isObjectEqual(obj1, obj2) {
  const obj1Keys = Object.keys(obj1);
  const obj2Keys = Object.keys(obj2);

  if (obj1Keys.length !== obj2Keys.length) {
    return false;
  }

  for (let key of obj1Keys) {
    if (obj1[key] !== obj2[key]) {
      return false;
    }
  }

  return true;
}

const obj1 = { a: 1, b: "hello" };
const obj2 = { a: 1, b: "world" };
const obj3 = { a: 1, b: "hello" };

console.log(isObjectEqual(obj1, obj2)); // false
console.log(isObjectEqual(obj1, obj3)); // true

在上面的例子中, isObjectEqual 函数比较了 obj1 和 obj2 的属性值并返回 false ,因为它们的 b 属性的值不相等。而 isObjectEqual(obj1, obj3) 返回 true ,因为它们的所有属性值都相等。

 

 

 

3. 使用 Lodash 等工具库判断两个对象是否相等

可以使用 Lodash 的 isEqual 方法(依然不比较引用地址)。 isEqual 方法会递归比较两个对象的属性值是否相等,包括嵌套对象和数组。

const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } };
const obj3 = { a: 1, b: { c: 3 } };

console.log(_.isEqual(obj1, obj2)); // true
console.log(_.isEqual(obj1, obj3)); // false

在上面的例子中, _.isEqual(obj1, obj2) 返回 true ,因为它们的所有属性值都相等,包括嵌套的对象。而 _.isEqual(obj1, obj3) 返回 false ,因为它们的 b.c 属性的值不相等。

 

 

 

4. JSON.stringify 方法

如果你的对象中只包含简单类型(如数字、字符串、布尔值和 null)以及其他对象或数组,则可以使用 JSON.stringify 方法将对象转换为字符串,然后比较这些字符串(还是不比较引用地址)。例如:

const obj1 = { a: 1, b: "hello", c: true };
const obj2 = { a: 1, b: "hello", c: true };
const obj3 = { a: 1, b: "world", c: true };

console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true
console.log(JSON.stringify(obj1) === JSON.stringify(obj3)); // false

在上面的例子中, JSON.stringify(obj1) 和 JSON.stringify(obj2) 都返回相同的字符串,因此它们的比较返回 true 。而 JSON.stringify(obj1) 和 JSON.stringify(obj3) 返回不同的字符串,因此比较返回 false 。

需要注意的是,这种方法只适用于简单类型和嵌套对象或数组,因为它无法处理对象中包含函数、正则表达式和 Date 等类型的情况。

 

5. 使用 Object.is() 方法

它与 === 运算符类似,但是有一些特殊情况,例如 Object.is(+0, -0) 返回 false ,而 === 运算符返回 true 。

const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;

console.log(Object.is(obj1, obj2)); // false
console.log(Object.is(obj1, obj3)); // true

在上面的例子中, Object.is(obj1, obj2) 返回 false ,因为 obj1 和 obj2 是两个不同的对象,而 Object.is(obj1, obj3) 返回 true ,因为 obj1 和 obj3 引用了同一个对象。

 

无论你使用哪种方法,都需要明确你对 相等 的定义以及对象属性的类型,并选择适合你需求的方法。

原文链接:https://www.cnblogs.com/ronaldo9ph/p/17380814.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在JS中如何判断两个对象是否相等 - Python技术站

(0)
上一篇 2023年5月8日
下一篇 2023年5月9日

相关文章

  • js判断是否有中文的脚本_js判断中文方法集合 原创

    标题:JS判断是否有中文的脚本 JS代码: /** * 判断字符串中是否存在中文字符 * @param {string} str – 待判断的字符串 * @returns {boolean} – 如果存在中文字符则返回true,否则返回false */ function hasChineseCharacter(str) { // 使用正则表达式进行匹配 va…

    JavaScript 2023年5月19日
    00
  • 有关js的变量作用域和this指针的讨论

    标题:有关JS的变量作用域和this指针的讨论 1. 变量作用域 1.1 作用域是什么 在JS中,作用域可以理解为变量的有效范围。JS支持两种作用域:全局作用域和函数作用域。 全局作用域是指整个JS文件,其内定义的变量可以被文件中任何一个函数所使用。 函数作用域是指只在函数体内部(包括函数体内嵌套的函数中)定义的变量。这些变量只在函数体内及其内部的函数中有效…

    JavaScript 2023年5月27日
    00
  • 禁用JavaScript控制台调试的方法

    禁用JavaScript控制台调试,即尝试防止网站被不良分子攻击,避免他们利用JavaScript控制台进行远程执行恶意代码或者非授权编辑页面。以下是禁用JavaScript控制台调试的完整攻略: 1. 禁用F12快捷键 在浏览器中按下F12键可以打开JavaScript控制台,因此禁用F12快捷键是禁用JavaScript控制台调试的一种简单方法。代码如下…

    JavaScript 2023年6月11日
    00
  • js实现接收表单的值并将值拼在表单action后面的方法

    实现接收表单的值并将值拼在表单action后面的方法,可以通过以下步骤来完成: 使用 HTML 表单标签创建表单,并指定表单的 action 和 method 属性以及 input 标签来定义表单项。 <form action="submit.php" method="post"> <label fo…

    JavaScript 2023年6月10日
    00
  • jquery+ajax每秒向后台发送请求数据然后返回页面的代码

    首先,我们需要明确这个需求的实现流程:前端通过jQuery发起Ajax请求,后端接收请求并处理,返回数据给前端,前端再通过jQuery将数据渲染至页面上。其中,需要注意的是前端需要每秒向后端发送一次请求,需要使用JavaScript定时器来完成。 下面,我提供两个示例,分别是使用原生JavaScript和jQuery实现每秒向后端发送请求并更新页面的代码。 …

    JavaScript 2023年6月11日
    00
  • javascript 中null和undefined区分和比较

    JavaScript中的null和undefined是两个特殊的值,表示值不存在或未定义。尽管它们看起来很相似,但在某些情况下有一些微小的区别。 null和undefined的差异 null是一个表示空值或无值的对象,它是一个表示未定义对象的类型,因此typeof null返回”object”。 undefined是一个原始值,表示一个未初始化或不存在的值,…

    JavaScript 2023年6月10日
    00
  • JS实现太极旋转思路分析

    下面是一份JS实现太极旋转的完整攻略。 1. 思路分析 太极旋转是一种常见的动画效果,其实现基本思路如下: 创建一个太极图形的HTML结构 使用CSS样式将其样式设置完成,达到一个静止的状态 使用JS来控制太极图形的旋转角度 具体实现过程中,其实旋转本质上是一个让元素不断改变其旋转角度的过程,我们可以通过JS创建一个变量来保存旋转角度的数值,每次修改该数值,…

    JavaScript 2023年6月11日
    00
  • Echarts自定义图形的方法参考

    下面是详细讲解Echarts自定义图形的方法参考的完整攻略。 1. 理解自定义图形的概念 在Echarts中,除了常见的图形类型(如折线图、柱状图、散点图等)以外,还支持自定义图形类型。自定义图形指的是使用自定义的图形形状绘制出的图表元素,例如可以用自定义的图形绘制出家具、车辆等实际物品,也可以用自定义的图形实现图表中的特效效果(如动画效果、光影效果等)。 …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部