JavaScript技巧: 判断两个对象的值是否相等

259 阅读1分钟

我们都知道,两个对象数据类型进行三等(===)值判断本质上是比较其引用的地址指针是否相等,如何来判断两个对象里面的值是否完全相等嗯,这就需要我们自己进行一个实现.

/**
 * ! 对象是否相等方法封装实现
 * * 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
}