javascript深拷贝

****
**********什么是深拷贝?:把数组/对象所有层的值,复制到新的数组/对象中**********
**********如何实现深拷贝?:①创建新数组/对象②判断基础类型,直接赋值③判断对象类型,递归调用函数,继续创建判断**********

①思考下面问题,希望用10秒钟作答
let arr=['小明','小张',['小李']]
let orr = [...arr]//三个点扩展运算符是浅拷贝
arr[2].push('onceweb')
console.log(orr)  //==>["小明", "小张", ["小李", "onceweb"]]
console.log(arr)  //==>["小明", "小张", ["小李", "onceweb"]]
浅拷贝:只拷贝第一层的值,第二层互相引用

②思考下面问题,希望用10秒钟作答
let obj={
  name:'小明',
  age:25,
  onceweb:{
    oName:"once"
  }
}
objonce = {...obj} //新对象赋值---扩展运算符
obj.onceweb.oName= "web"
console.log(objonce.onceweb.oName)  //==>web
console.log(obj.onceweb.oName)  //==>web
浅拷贝:只拷贝第一层的值,第二层互相引用

******************************************************************
深拷贝
目标:遍历,判断,递归,创新,赋值
①对象嵌套对象和数组
let obj={
  name:'小明',
  age:25,
  oncearr:[100,200],
  onceweb:{
    oName:"once"
  }
}
//实现:深拷贝
//注意:先写array类型的判断(因为array的父类是object,写在上面无论数组对象都会进去)
//注意:Object.prototype.toString.call()为判断条件更好
//返回"[object String]" "[object Array]" "[object Object]" "[object Function]" 基本类型字符串,数组,对象,函数
let newObj = {};
function deepClone(newO,old){
  for(let key in old){
    let value = old[key]
    if(value instanceof Array){
        newO[key] = []//被拷贝的是数组,创建一个新数组
        deepClone(newO[key],value)
    }else if(value instanceof Object){
        newO[key] = {}//新对象
        deepClone(newO[key],value)
    }else{
        newO[key] = value;//基础类型,单纯值复制
    }
  }
}
deepClone(newObj,obj)
obj.oncearr.push(666)
console.log(newObj,obj)
//总结:深拷贝
//递归每层引用类型,遇到对象/数组,创建一个新的,把基础值复制过来
posted @ 2021-07-10 18:13  onceweb  阅读(41)  评论(0)    收藏  举报