浅拷贝与深拷贝

浅拷贝与深拷贝的区别

1、浅拷贝只复制一层对象的属性、值引用(场景:对于只有一层结构的Array和Object想要拷贝一个副本时使用)

2、深拷贝则递归复制了所有层级、地址引用(场景:复制深层次的object的数据结构)

浅拷贝的实现方式

1、ES6 的 Object.assign()  //当object只有一层时是深拷贝
   var obj = {a:{a:'kobe',b:39}};
   var initobj = object.assign({},obj)
   initobj.a.a = 'kuli';
   console.log(obj.a.a)//kuli

2、Array.prototype.cancat()  //concat的方法是不修改原数组,只会返回一个浅复制原数组中的新数组
  let arr = [1,3{ username: 'kobe' }]
  let arr2 = arr.concat();
  arr2[2].username = 'kuli';
  console.log(arr)  //kuli

3、ES6中的对象扩展
  let list = [0,1,2,3,4]
  let newList = {...list};

4、Array.prototype.slice() //slice的方法是不修改原数组,只会返回一个浅复制原数组中的新数组
  let arr = [1,3,{ username: 'kobe' }]
  let arr2 = arr.slice()
  arr[2].username = 'kuli'
  console.log(arr) //kuli


 深拷贝的实现方式

1、ES6 的 Object.assign()  //当下为一层(深拷贝)
  let obj = { username:'kobe' }
  let obj2 = Object.assign({},obj)
  obj2.username = 'kuli'
  console.log(obj) //kobe

2、JSON.stringify 和 JSON.parse  //并不能拷贝函数
  JSON.parse(JSON.stringify(obj));

3、递归实现
  deepClone(obj){
   let objClone = Array.isArray(obj)?[]:{};
   if(obj && typeof obj==="object"){
    for(let key in obj){
      // 判断是不是自有属性,而不是继承属性
      if(obj.hasOwnProperty(key)){
        //判断ojb子元素是否为对象或数组,如果是,递归复制
        if(obj[key]&&typeof obj[key] ==="object"){
          objClone[key] = this.deepClone(obj[key]);
        }else{
          //如果不是,简单复制
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
 }

 

posted @ 2021-08-24 17:15  luckyshan  阅读(84)  评论(0)    收藏  举报