浅拷贝,通俗理解就是拷贝一层,例如{a:1,b:{c:1,d:2}},那么拷贝的是a,b指向的内存的位置;由于b指向的是一个对象的引用,那么,我对原来对象中的c属性进行修改,也会影响到新对象属性的值;但是修改原来对象中a的值,就不会影响后新对象a的值;
那么如何实现浅拷贝呢?
function simpleClone(obj,newObj) {
if(typeof obj!=="object"){
return ;
}
for(let prop in obj){
// 如果传入的对象有该属性并且不是继承的
if(obj.hasOwnProperty(prop))
{
newObj[prop] = obj[prop];
}
}
return newObj;
}
那么如何实现深拷贝呢?
let arr = {a:1,b:2,c:3,d:4,e:{ad:1,ac:2},f:[1,2]};
function deepClone(obj,newObj={}) {
for(let prop in obj){
if(obj.hasOwnProperty(prop)){
// 判断遍历出来的object[prop]是否是object类型,并且不为空
if(typeof obj[prop]==="object" && obj[prop]!==null){
console.log(obj[prop].constructor.name);
newObj[prop] = obj[prop].constructor.name === "Array"? []:{};
deepClone(obj[prop],newObj[prop])
}else{
newObj[prop] = obj[prop];
}
}
}
return newObj
}
let arr3 = deepClone(arr);
console.log(arr3 === arr);
arr.e.ad = 99;
console.log(arr3.e.ad)//=>1;
其实还有简便的方法:
浅拷贝:Object.assign(obj,obj1,obj2)
深拷贝:JSON.parse(JSON.stringfy(obj)),方便又快捷,只是遇到事件时比较难处理;
先学难的再学简单的,提高自己的代码能力!