//基础对象深/浅拷贝
let obj = { a:'1', b:'2'}
// let newObj = obj //浅拷贝
// newObj.a = 4 // 改变newObj的值,obj也会发生改变
// console.log(obj,newObj) // newObj发生改变,obj也会发生改变
let newObj = JSON.parse(JSON.stringify(obj)) //深拷贝
// let newObj = Object.assign({},obj) //深拷贝
// let newObj = {...obj} //深拷贝
newObj.a = 6 //改变改变newObj的值
console.log(obj,newObj) // newObj发生改变,obj不会发生改变
//数组对象,多维对象深/浅拷贝
// let arrJson = [{id:1,name:'js',children:[{name:1111,id:12}]},{id:2,name:"html"},{id:3,name:"css"},{id:4,name:'vue'}]
let arrJson = {
title:'js',
id:1,
children:{
name:'对象拷贝',
children:{
name:'text'
}
},
fun(){
let title = this.title + this.children.name
return title
}
}
// let newArrJson = arrJson //直接赋值,浅拷贝,改变newArrJson的值,原对象arrJson的值也会一起改变
// let newArrJson = JSON.parse(JSON.stringify(arrJson)) //JSON,深拷贝,改变newArrJson的值,原对象arrJson的值不会发送改变
// let newArrJson = {...arrJson} // 多层嵌套对象,使用解构语法,只能最外层对象,嵌套深层次的对象newArrJson发生改变,原对象arrJson也会发生变化
// let newArrJson = Object.assign({},arrJson)// 多层嵌套对象浅拷贝,使用解构语法,只能最外层对象,嵌套深层次的对象newArrJson发生改变,原对象arrJson也会发生变化
let newArrJson = deepCopy(arrJson) // 改变newArrJson的值,原对象arrJson的值不会发送改变
// newArrJson[0].id = 666
// newArrJson[0].children[0].name = 666
newArrJson.children.name = 666
newArrJson.title = 666
console.log(arrJson,newArrJson)
function deepCopy (obj) {
let newobj = (obj instanceof Array) ? [] : {};
if(typeof obj !== 'object'){
return;
}
for(let i in obj){
newobj[i] = typeof obj[i] === 'object' ? deepCopy(obj[i]) : obj[i];
}
return newobj
}
数组对象,多层嵌套对象以上同理