- JS中的深克隆与浅克隆
浅克隆是原始类型为值传递,对象类型仍为引用传递,与原数据公用一套内存地址,修改一处别的也会受到影响。
深克隆是所有元素或属性完全复制,与原对象完全脱离,也就是说所有对新对象的修改都不会映射到原对象中。
- JS实现浅克隆
var lilei={
sname:"li lei",
sage:12,
address:{
city:"xian",
street:"未央区"
}
}
function clone(oldObj){
if(oldObj==null){return null};
if(typeof oldObj!=="Object"){return oldObj}
var newObj = Array.isArray(oldObj)?[]:{};
for(var key in oldObj){
newObj[key] = oldObj[key]
}
return newObj;
}
var lilei2 = clone(lilei);
console.log(lilei===lilei2)//true
console.log(lilei);
console.log(lilei2)
lilei2.sname="李雷"
console.log(lilei.sname);//李雷
lilei2.address.city="beijing";
console.log(lilei.address.city);//beijing 很明显原对象的属性值已被修改
- JS实现深克隆
var hmm={
sname:"han meimei",
sage:15,
address:{
city:"shenzhen",
street:"林湖区"
}
}
function clone2(oldObj){
var newObj = Array.isArray(oldObj)?[]:{};
for(var key in oldObj){
if(typeof oldObj[key] !=="object"){
newObj[key]=oldObj[key]
}else{
newObj[key]=clone2(oldObj[key])
}
}
return newObj;
}
var hmm2=clone2(hmm);
console.log(hmm,hmm2);
console.log(hmm===hmm2);//false
hmm2.sname="韩梅梅"
hmm2.address.city="xian";
console.log(hmm.sname);//还是han meimei 原对象没变
console.log(hmm.address.city);//还是shenzhen 原对象没变
也可以通过第三方库lodash的api如deepClone