不管是深拷贝还是浅拷贝针对的都是对象类型
一丶只针对对象中的属性(第一层)都是基本类型,如果属性是对象类型深拷贝会失效
1.1丶浅拷贝
地址拷贝,2个对象指向同一个地址
方式1: 直接赋值
let user1={name:jack,pass:“1234”};
let user2=user1;
方式2: Object.assign合并单个对象
let user3=Object.assign(user1);
1.2丶深拷贝
值拷贝,2个对象指向不同的内存地址,将一个对象的值拷贝到另一个对象中
放式1:…扩展运算符
let user1={name:jack,pass:“1234”};
let user2={…user1};
方式2:遍历的方式一个一个拷贝进行
- for in
- Object.keys()
方式3:对象合并,也会产生新对象,合并一个新对象
let user3=Object.assign ( {} , user1 );
方式4:JSON对象转换
let user4=JSON.parse( JSON.stringify ( user1 ) );
注意:
- 对象类型中的属性 还是对象的话,其实还是浅拷贝(对象这个标识内存中存的都是地址)
二丶对象属性中还有 对象(第二层之后还是对象)
递归
function copyObj(obj) {
let res={};
if(obj instanceof Array){
res=[];
}
for(let fieldName in obj){
if(obj[fieldName] instanceof Object){
res[fieldName]=copyObj(obj[fieldName]);
}else{
res[fieldName]=obj[fieldName];
}
}
return res;
}
let user1={name:"jack",pass:"1234",obj:{sex:"男",address:"上海"}};
let user2=copyObj(user1);
user2.obj.sex="女";
console.log(user1);//男
JSON
let obj1 = JSON.parse(JSON.stringify(user1));