使用===
比较符号是无法判断两个对象的属性是否相等,===
只有两个对象的底层引用同一个值的时候,才会返回true,其他情况都会返回false。因此需要利用isEqual
方法,isEqual
方法只有两个对象的属性全部相等,就会返回true。
isEqual
方法需要考虑三种情况:
- 情况1:如果传入的两个数据有一个不是对象的话,那么它就是值类型的数据,这个时候就直接用
===
进行判断是否相等。 - 情况2:如果传入的两个数据为同一个对象,那么就直接返回 true。
- 情况3:如果传入的是两个不同的对象或数组,需要使用递归进行深度比较。
// 首先要判断进行比较的两个数据类型是否为对象
function isObject(obj){
return typeof obj === 'object' && obj !== null
}
// 手写 isEqual
function isEqual(obj1, obj2){
// 情况1:如果传入的两个数据有一个不是对象的话,那么它就是值类型的数据,这个时候就直接用 === 进行判断是否相等
if(!isObject(obj1) || !isObject(obj2)){
return obj1 === obj2
}
// 情况2:如果传入的两个数据为同一个对象,那么就直接返回 true
if(obj1 === obj2){
return true
}
// 情况3:如果传入的是两个不同的对象或数组,需要使用递归进行深度比较
// 1. 首先判断两个对象的长度是否相等
const obj1Keys = Object.keys(obj1)
const obj2Keys = Object.keys(obj2)
if(obj1Keys.length !== obj2Keys.length){
return false
}
// 2. 然后以obj1的属性为基准,和obj2的属性一项一项进行对比
for(let key in obj1){
const res = isEqual(obj1[key], obj2[key])
if(!res){
return false
}
}
// 3. 如果两个对象长度相等,且每个属性值都相等,最终判断两个对象全相等,返回 true
return true
}
// 测试
const obj1 = {
a: 100,
b: {
x: 100,
y: 300
}
}
const obj2 = {
a: 100,
b: {
x: 100,
y: 200
}
}
console.log(isEqual(obj1, obj2)) // true