手写系列 - shallowCopy、deepCopy

146 阅读1分钟
function shallowCopy(obj) {
  if (!obj || typeof obj !== "object") return;

  let newObj = Array.isArray(obj) ? [] : {}
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = obj[key]
    }
  }

  return newObj;

}


function deepCopy(obj) {
  if (!obj || typeof obj !== "object") return

  let newObj = Array.isArray(obj) ? [] : {}
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key]
    }
  }
  return newObj;


}


const tom = {
  name: '汤姆',
  type: '猫',
  skill: {
    cook: ['烤老鼠'],
    friends: ['杰瑞'],
  }
};

// const tom1 = shallowCopy(tom);
// tom1.name = "tom cat"
// tom1.skill.cook = "chichichi"  //引用类型会被修改
// console.log("tom:", tom);
// console.log("tom1:", tom1);

const tom1 = deepCopy(tom);
tom1.name = "tom cat"
tom1.skill.cook = "chichichi"  //tom1 修改和 tom没关系了
console.log("tom:", tom);
console.log("tom1:", tom1);
// 浅拷贝
// const tom1 = { ...tom }
// const tom1 = Object.assign(tom)
// tom1.name = "tom cat"
// tom1.skill.cook = "chichichi"  //tom1 修改和 tom没关系了
// console.log("tom:", tom);
// console.log("tom1:", tom1);

// 深拷贝
const tom1 = JSON.parse(JSON.stringify(tom))
tom1.name = "tom cat"
tom1.skill.cook = "chichichi"  //tom1 修改和 tom没关系了
console.log("tom:", tom);
console.log("tom1:", tom1);