****
**********什么是深拷贝?:把数组/对象所有层的值,复制到新的数组/对象中**********
**********如何实现深拷贝?:①创建新数组/对象②判断基础类型,直接赋值③判断对象类型,递归调用函数,继续创建判断**********
①思考下面问题,希望用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)
//总结:深拷贝
//递归每层引用类型,遇到对象/数组,创建一个新的,把基础值复制过来