js实现浅层比较两个对象是否相等

93 阅读1分钟

两个对象实现浅层比较

let obj = {
  a:20
}

let obj1 = {
  b:30,
  c:obj,
  arr:[10,20,30]
}
let obj2 = {
  b:40,
  c:obj,
  arr:[10,20,30]
}
// 判断是否是对象
const isObject = (obj)=>{
  return obj!==null && /^(object)|function$/.test(typeof obj);
}
// 浅比较对象
const shallowEqual = function shallowEqual(obj1,obj2){
  //如果obj1或者obj2不是对象 直接返回false
  if(!isObject(obj1) || !isObject(obj2)) return false   
  // 比较成员数量   Reflect.ownKeys方法取出对象的key并返回key对象和Object.keys类似
  let keys1 = Reflect.ownKeys(obj1),  
      keys2 = Reflect.ownKeys(obj2)
      //长度不相等返回false
    if(keys1.length !==keys2.length)  return false
    // 如果数量一致 逐步比较内部成员 浅比较只比较一级成员
    for(let i = 0;i<keys1.length;i++){
      let key = keys1[i]  //对象的每一个key
      // 如果一个对象中有这个成员 一个对象中没有 或者 都有这个成员 但是成员值不一样 都应该被判定为对象不相同
      //hasOwnProperty查看对象中是否有对应的key Object.is比较两个值是否相等  因为存在NaN !== NaN的情况所以使用OBject.is
      if(!obj2.hasOwnProperty(key) || !Object.is(obj1[key],obj2[key])){
        return false
      }

    }
    // 以上处理完成 没有不相同的成员 则两个对象相等
    return true
}

shallowEqual(obj1,obj2)