我们都知道,两个对象数据类型进行三等(===)值判断本质上是比较其引用的地址指针是否相等,如何来判断两个对象里面的值是否完全相等嗯,这就需要我们自己进行一个实现.
/**
* ! 对象是否相等方法封装实现
* * isObjectValueEqual(obj1, obj2) 将给定的对象参数进行是否相等比较
*
* @param {Object} obj1
* @param {Object} obj2
* @return {Boolean}
*/
function isObjectValueEqual(obj1, obj2) {
// 1. 判断地址是否相等,是则 return true
if (obj1 === obj2) {
return true
}
// 获取对象本身所有属性键值
let obj1Proper = Object.getOwnPropertyNames(obj1)
let obj2Proper = Object.getOwnPropertyNames(obj2)
// 2. 判断键值数组长度是否相等
if (obj1Proper.length !== obj2Proper.length) {
return false
}
// 3. 遍历键值判断是否相等
Object.keys(obj1).forEach(key => {
// 3.1 判断 obj2 中是否存在此键,不存在直接 return false
if (obj2.hasOwnProperty(key)) {
// 3.2 判断 obj1[key] 是否为对象,是则递归判断,不是则判断值是否相等,不等于直接 return false
if (typeof obj1[key] === 'object') {
// 3.3 递归调用返回结果如果为 false 则取反 return false
if (!isEquality(obj1[key],obj2[key])) {
return false
}
} else if (obj1[key] !== obj2[key]){
return false
}
} else {
return false
}
})
// 判断不为 false 则返回 true
return true
}