首页 > 其他分享 >在JS中如何判断两个对象是否相等

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

时间:2023-05-08 09:57:10浏览次数:36  
标签:obj1 obj3 obj2 const 对象 JS 相等 false true

在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 引用了同一个对象。

 


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

标签:obj1,obj3,obj2,const,对象,JS,相等,false,true
From: https://www.cnblogs.com/ronaldo9ph/p/17380814.html

相关文章

  • Node.js躬行记(28)——Cypress自动化测试实践
    最近在研究如何提升项目质量,提炼了许多个用于自测的测试用例,但是每次修改后,都手工测试,成本太高,于是就想到了自动化测试。在一年前已将Cypress集成到管理后台的项目中,不过没有投入到实践中。今天在实践时发现,版本已经到了12.X,当时集成的版本是8.X。一、准备在......
  • js注册全选事件、单选全部后“全选”勾选事件
    //注册全选事件$("#selectAll").click(function(){varisAllCheck=$("#selectAll").prop("checked");varitems=document.getElementsByName("ck......
  • js基础---set、math、date等类
    set类概念,需要new功能为创建一个集合,与数组类似,区别就是它不能设置重复的值math是一个工具类,不需要new,可直接使用它的方法。他的常用方法如下:date类,需要newgetTime():返回一个时间戳,单位为毫秒。......
  • 巧用Chrome格式化压缩后的js文件
    对于格式化的js文件,可以用chrome处理。打开chrome浏览器,按F12进入开发者工具界面,找到一个压缩js文件,如图: 在浏览器的底部(左边)的工具栏有一个"{}"样的图标 ,点击一下就可以了。 格式后: 格式化的js也可以左击保存:......
  • 为什么useState返回的是数组而不是对象?
    1.如果 useState 返回数组,那么可以顺便对数组中的变量命名,代码看起来也比较干净2.自定义hook的时候可以遵循一个简单原则:当参数大于2个的时候返回值的类型返回 object,否则返回数组。......
  • Json数据的序列化与反序列化的三种常用方法介绍
    以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解。。作者才疏学浅,难免会有理解不到位的地方。。还请各位读者批判性对待。。。    本文主要介绍在Json数据的序列化与反序列化的过程中我经常用到的三种工具的基本使用方法,及其他们之间......
  • Vue.js:Vue-Router动态路由从服务器接口获取路由数据
    (目录)文档https://v3.router.vuejs.org/zh/installation.html版本号"vue":"2.6.10","vue-router":"3.6.5",有几种方式实现动态路由:前端配置完整路由,通过接口返回的数据判断是否可显示,是否可访问前端配置部分路由,由后端接口返回的数据生成新路由抛开路由的思维,是否......
  • 对象存储 OSS(阿里云)
    教程安装SDK//Endpoint以杭州为例,其它Region请按实际情况填写。Stringendpoint="http://oss-cn-hangzhou.aliyuncs.com";//云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录https://ram.console.aliyun.c......
  • JS逆向 -- 某平台登录算法分析(RSA加密)
    一、输入账号密码,进行抓包二、F12打开开发者工具,抓包分析,password被加密了三、全局搜索password关键字,挨个分析,在箭头标记处找到了关键代码四、局部搜索,定位加密的关键点,通过JSEncrypt,setPublicKey等关键字分析是RSA加密五、代码编写1、调用RSA加密的基本代码编写functionaiyou(pw......
  • 面向对象高级
    isinstance(obj,cls)和issubclass(sub,super)isinstance(obj,cls)检查是否obj是否是类cls的对象classFoo(object):passobj=Foo()isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生类classFoo(object):passclassBar(Foo):......