1、深拷贝与浅拷贝的区别:如果B复制了A,当A发生改变时,B也发生改变,此时为浅拷贝,反之则为深拷贝。
基本数据类型,包括:string、number、boolean、null、undefined。
引用数据类型,包括:数组、函数、对象。
1)基本数据类型储存在栈内存中,如:let a=1;b=a;
当b=a时,栈内存会重新开辟一个内存,当修改a的值时,b的值不会改变。
2)引用数据类型,名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存。
如:let a=[1,2,3,4];b=a
当b=a进行拷贝时,其实只是复制a的引用地址,并非堆里面的值。当a数组发生改变时,b也会受到影响。
2、数组深拷贝
1)slice
let arr=[2,3,4,5];
let arr1=arr.slice();
arr[0]=0;
console.log(arr1);//[2,3,4,5]
console.log(arr===arr1);//false
2)concat
Array.prototype.clone=function(){
return [].concat(this);
//return this.concat()
};
let arr=[123,"aaa"];
let arr1=arr.clone(arr)
arr[0]=0;
console.log(arr1);
3)遍历数组
Array.prototype.clone=function(){
let a=[];
for(let i=0,l=this.length;i<l;i++){
a.push(this[i]);
};
return a;
}
let arr=[1,2,3,4,5,6];
let arr1=arr.clone();
console.log(arr1);
4)扩展运算符
let a=[1,2,3,4,5];
let b=[...a];
a[0]=0;
console.log(b);
3、对象的深拷贝
1)for循环
let obj={
name:"zjj",
age:25,
job:"software engineer"
}
const copyObj=(obj)=>{
let res={};
for(let key in obj){
res[key]=obj[key];
}
return res;
}
let obj1=copyObj(obj);
2、转换成json再转换成对象
let obj={
name:"zjj",
age:25,
job:"software engineer"
}
const obj1=JSON.parse(JSON.stringify(obj));
console.log(obj1);
3)扩展运算符
let obj={
name:"zjj",
age:25,
job:"software engineer"
}
const {...obj1}=obj;
obj.age=18;
console.log(obj1);