分析代码:
基本数据类型的拷贝:
var x=8;
var y=x;
console.log(x,y); //8 8
y="A";
console.log(x,y); //8 “A” 不影响原来的数据;
数组的浅拷贝
var a=[10,20,30,40,50];
var b=a;
console.log(a,b); //[10,20,30,40,50] [10,20,30,40,50]
b[0]="A";
console.log(a,b); //[“A”,20,30,40,50] [“A”,20,30,40,50]
数组变量之间赋值发生浅拷贝的原因:数组变量内部存储的是数组的地址,而不是数组的元素。
解决数组的浅拷贝问题:
var a=[10,20,30,40,50];
var b=[...a];
console.log(a,b); //[10,20,30,40,50] [10,20,30,40,50]
b[0]="A";
console.log(a,b); //[10,20,30,40,50] ["A",20,30,40,50]
对象的浅拷贝
var obj1={x:100,y:200,z:300};
var obj2=obj1;
console.log(obj1,obj2); // {x:100,y:200,z:300} {x:100,y:200,z:300}
obj2.x="A";
console.log(obj1,obj2); //{x:"A",y:200,z:300} {x:"A",y:200,z:300}
解决对象的首层浅拷贝问题:
(1)let obj2={...obj1}; //扩展运算符
(2)let obj2=Object.assign({},obj1); //Object.assign()方法
(3)let x={}; //对象成员逐个进行拷贝
Object.entries(obj1).forEach(item=>{
x[item[0]]=item[1];
})
对象的深度拷贝:
function deepCopy(object){
let temp=object.constructor===Object?{}:[];
Object.keys(object).forEach(key=>{
if(object[key].constructor!==Object && object[key].constructor!==Array){
temp[key]=object[key];
}else{
temp[key]=deepCopy(object[key]);
}
)}
return temp;
}
constructor属性是对象的构造函数属性,将返回变量所属类型的构造函数名,也被称为”类名“。