理解:浅拷贝,只克隆第一层,修改拷贝后的第二层将影响被拷贝的数据
浅拷贝
三种方式
let obj={
a:10,
b:[10,20],
c:{
x:10
},
d:/^d+$/
}
let obj1={...obj} //第一种
let obj2=Object.assign({},obj) //第二种
//封装 第三种
let obj3={}
for(let key in obj){
if(!obj.hasOwnProperty((key))) break;
obj3[key]=obj[key]
}
深拷贝
第一种 弊端 对应Key 是函数 日期 正则 会有丢失的情况
let obj={
a:10,
b:[10,20],
c:{
x:10
},
d:/^d+$/
}
let obj1=let obj4=JSON.parse(JSON.stringify(obj)){...obj} //第一种 弊端 对应Key 是函数 日期 正则 会有丢失的情况
第二种封装
//第二种封装
function deep(obj){
if(obj===null) return null
if(typeof obj!=='object') return obj; //如果不是object直接返回
if(obj instanceof RegExp){
return new RegExp(obj) //如果是正则
}
if(obj instanceof Date){
return new Date(obj) //如果是日期
}
if(obj instanceof Function){
return new Function(obj) //如果是函数
}
// let newObj={}
// let newObj=new Object
let newObj=new obj.constructor //既能克隆object 也能克隆实例
for(let key in obj){
if(obj.hasOwnProperty(key)){
newObj[key]=deep(obj[key])
}
}
return newObj
}
let obj5=deep(obj)