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等。
复杂数据类型都会存储在堆内存中,简单数据类型则是存储在栈内存里。我们在定义一个复杂数据类型的时候,会先在堆内存中开辟空间,把数据存进去后,再把内存地址返回给我们所定义的变量。这样看来,我们所进行的对比操作,原来不是值的对比,而是内存地址的对比。
简单的解决方法
方法一:通过JSON.stringify(obj)来判断两个对象转后的字符串是否相等
优点:用法简单,对于顺序相同的两个对象可以快速进行比较得到结果
缺点:这种方法有限制就是当两个对比的对象中key的顺序不是完全相同时会比较出错
遇见问题解决问题
利用Object.assign的复制特性,将对比对象的属性值复制到源对象的属性上,这样生成的新对象就可以保证是按照源对象的顺序排列的。
这样就可以用这个方法判断了。
如果对象中嵌套对象,那这个方法就解决不了了,我们需要引入递归和类判断系统了
先需要写一个类型判断方法
然后再就行对比,两个是连到一块的。
这个就是先判断是不是object类型和Array类型的如果不是直接return返回。如果是就判断两个类型是不是一样,然后再通过Object.keys()拿出所有的属性名字,然后用se6的...对象合并,然后再判断两个参数的长度是否一样,然后循环key值的数组先走判断是不是object类型和Array类型如果是直接递归,如果不是就对两个参数进行对比。