js中判断两个对象是否相等。

js中判断两个对象是否相等。

js中的Object、Array、Function等复杂数据类型,是无法直接用==和===操作符进行比对的。

Object对比

const tar = {

  name:'张三',

  age:12,

  address:'上海市浦东新区'

}

const _tar = {

  name:'张三',

  age:12,

  address:'上海市浦东新区'

}

console.log(tar == _tar);  // false

console.log(tar === _tar); // false

Array对比

console.log([1,2,3] === [1,2,3]); // false

console.log([1,2,3] === [1,2,3]); // false

因为js中的Object,Array,function是引用数据类型,引用数据类型在js中对比的不是值,而是内存地址的对比,也就是说对比的是引用地址。

 

原理如下

js的数据类型分为简单数据类型和复杂数据类型。简单数据类型包括:Number、String、Boolean、undifined、Null等,复杂数据类型包括:Object、Array、function等。

 

复杂数据类型都会存储在堆内存中,简单数据类型则是存储在栈内存里。我们在定义一个复杂数据类型的时候,会先在堆内存中开辟空间,把数据存进去后,再把内存地址返回给我们所定义的变量。这样看来,我们所进行的对比操作,原来不是值的对比,而是内存地址的对比。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBxcV80OTY0MzE5NQ,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

简单的解决方法

 

方法一:通过JSON.stringify(obj)来判断两个对象转后的字符串是否相等

优点:用法简单,对于顺序相同的两个对象可以快速进行比较得到结果

缺点:这种方法有限制就是当两个对比的对象中key的顺序不是完全相同时会比较出错

 

遇见问题解决问题

利用Object.assign的复制特性,将对比对象的属性值复制到源对象的属性上,这样生成的新对象就可以保证是按照源对象的顺序排列的。

233a6cea853d43039c080abdc211bc45.png

这样就可以用这个方法判断了。

58a9764f82db49b2b7eaad10827fd557.png

 

如果对象中嵌套对象,那这个方法就解决不了了,我们需要引入递归和类判断系统了

先需要写一个类型判断方法

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBxcV80OTY0MzE5NQ,size_20,color_FFFFFF,t_70,g_se,x_16

 

然后再就行对比,两个是连到一块的。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBxcV80OTY0MzE5NQ,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBxcV80OTY0MzE5NQ,size_20,color_FFFFFF,t_70,g_se,x_16 

 

这个就是先判断是不是object类型和Array类型的如果不是直接return返回。如果是就判断两个类型是不是一样,然后再通过Object.keys()拿出所有的属性名字,然后用se6的...对象合并,然后再判断两个参数的长度是否一样,然后循环key值的数组先走判断是不是object类型和Array类型如果是直接递归,如果不是就对两个参数进行对比。

 

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在JavaScript判断两个对象是否相同可以使用不同的方法。引用\[1\]提供了一个递归的方法isObejctValueEqual,该方法会递归比较两个对象的属性值是否相等。该方法首先获取两个对象的属性名数组,如果两个数组的长度不相等,则返回false。然后遍历属性名数组,对于每个属性名,判断两个对象是否都有该属性名,如果没有则返回false。如果属性值是对象,则递归调用isObejctValueEqual方法进行比较,如果属性值不相等,则返回false。如果属性值不是对象,直接比较两个属性值是否相等。如果所有属性值都相等,则返回true。使用该方法可以判断两个对象是否相同。引用\[2\]提供了另一种递归的方法equals,该方法也会递归比较两个对象的属性值是否相等。该方法首先获取两个对象的属性名数组,如果两个数组的长度不相等,则返回false。然后遍历属性名数组,对于每个属性名,判断两个对象是否都有该属性名,如果没有则返回false。如果属性值是对象,则递归调用equals方法进行比较,如果属性值不相等,则返回false。如果属性值不是对象,直接比较两个属性值是否相等。如果所有属性值都相等,则返回true。使用该方法可以判断两个对象是否相同。引用\[3\]提供了另一种简单的方法isObjectValueEqual,该方法只比较两个对象的属性值是否相等,不进行递归比较。该方法首先获取两个对象的属性名数组,如果两个数组的长度不相等,则返回false。然后遍历属性名数组,对于每个属性名,判断两个对象的该属性值是否相等,如果不相等,则返回false。如果所有属性值都相等,则返回true。使用该方法可以判断两个对象是否相同。 #### 引用[.reference_title] - *1* *3* [如何判断JS两个对象是否相等?](https://blog.csdn.net/Dreamlandz/article/details/119648330)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JS判断两个对象是否相等](https://blog.csdn.net/weixin_43416349/article/details/121225457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值