手搓深拷贝

发布时间 2023-07-26 14:07:13作者: Dou-D

手搓深拷贝

const obj = {
  name: "tom",
  age: 19,
  hobby: ["篮球", "排球"],
  sayhi() {
    console.log("sayhi");
  },
  info:{
    name:'jerry',
    age: 20
  }
};
const o = {};
//在写Object和Array的判断条件时,数组必须写在对象的前面。因为数组也是一种对象
function fn(newObj, oldObj) {
  for (const key in oldObj) {
    if (!newObj[key]) {
      // Array
      if (oldObj[key] instanceof Array) {
        newObj[key] = []
        fn(newObj[key], oldObj[key]);
      }
      // Object
      else if(oldObj[key] instanceof Object) {
        newObj[key] = {}
        fn(newObj[key], oldObj[key]);
      }
      else {
        newObj[key] = oldObj[key];
      }
    }
  }
}
fn(o, obj);
o.hobby[0] = '乒乓球'

o.info.age = '22'
console.log(o);
/*{
  name: 'tom',
  age: 19,
  hobby: [ '乒乓球', '排球' ],
  sayhi: {},
  info: { name: 'jerry', age: '22' }
}*/
console.log(obj);
/*{
  name: 'tom',
  age: 19,
  hobby: [ '篮球', '排球' ],
  sayhi: [Function: sayhi],
  info: { name: 'jerry', age: 20 }
}*/