详细代码: code demo
异同:
浅复制 (影子克隆): 只复制对象的基本类型, 对象类型, 仍属于原来的引用。
深复制 (深度克隆): 不紧复制对象的基本类, 同时也复制原对象中的对象。就是说完全是新对象产生的。
思路:
遍历所有该对象的属性,
如果该属性是 "object" 则需要特殊处理,
如果这个 object 对象比较特殊,是一个数组,那就创建一个新的数组并深复制数组里的元素
如果这个 object 对象是个非数组对象,那直接再对它递归调用深复制方法即可。
如果不是 "object",则直接正常复制就行。
对象的拷贝实现
浅拷贝
const obj = {
a:10,
b:{
c:'ccc'
}
};
// 方法一:Object.assign
const a={};
Object.assign(a,obj);
//方法二:对象解构
const a = {...obj,{}}
深拷贝
function deepCopy(obj){
// object
if(typeof obj === 'object'){
// 排除null;
if(obj === null){
return null;
}
// array
if(Array.isArray(obj)){
const newArr = [];
for(let i=0;i<obj.length;i++){
const item = deepCopy(obj[i]);
newArr.push(item);
}
return newArr;
}
// other->object
const keys = Object.keys(obj);
const tempObj = {};
for(let key of keys){
const v = obj[key];
tempObj[key] = deepCopy(v);
}
return tempObj;
}else{
return obj;
}
};
测试
const mock = ({
a:'111',
b:[1,2,3,4,5,{
s:null,
ss:undefined,
sss:[111]
}],
c:{
cc:{
ccc:'2222'
},
ccc02:[555],
}
});
// test
const r = deepCopy(mock);
r.b.s = 'new s value'; // r.b.s =>'new s value'; mock.b.s => null
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。