参考学习:https://blog.csdn.net/baidu_36065997/article/details/80309991
https://www.cnblogs.com/echolun/p/7889848.html
在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。
深拷贝:
数组:
法一:for循环
let arr1 = [1,2,3];
let arr2 = copyArr(arr1);
function copyArr(arr){
let res=[];
for(let i=0,length=arr.length;i<length;i++){
res.push(arr[i]);
}
return res;
}
法二: slice
let arr1 = [1,2,3];
let arr2 = arr1.slice(0);
法三: concat
let arr1 = [1,2,3];
let arr2 = arr1.concat();
法四:扩展运算符
let arr1 = [1,2,3];
let [...arr2] = arr1;
法五:Array.from
如果参数是一个真正的数组,Array.from会返回一个一模一样的新数组
let arr1 = [1,2,3];
let arr2 = Array.from(arr1);
对象
法一:for循环
let obj1={count:1,name:'grace',age:1};
let obj2 = copyObj(obj){
let res = {};
for(let key in obj){
res[key]=obj[key];
}
return res;
}
法二:利用JSON
let obj1={count:1,name:'grace',age:1};
let obj2 = JSON.parse(JSON.stringify(obj1));**
法三:扩展运算符
let obj1={count:1,name:'grace',age:1};
let {...obj2} = obj1;
可以实现数组和对象的深拷贝
function deepCopy(obj){
let result = Array.isArray(obj)?[]:{};
if(obj && typeof obj === 'object'){
for(let key in obj){
if(obj.hasOwnProperty(key)){
if(obj[key]&&typeof obj[key]==='object'){
result[key]=deepCopy(obj[key]);
}else{
result[key]=obj[key];
}
}
}
}
return result;
}
我们还可以借用JQ的extend方法。
注意:ES6新增了Object.assign() 方法