2020-07-07 deepclone,我要深拷贝。

一:为什么要深拷贝?

说到深拷贝(拷贝基本适用于引用类型的拷贝),就不得不说栈/堆存储、JS数据类型、浅拷贝。

1:栈(Stack)
存放基本类型,占据固定大小的空间。
2:堆(Heap)
存放引用类型(在栈内存中存一个基本类型值保存对象在堆内存中的地址,用于引用这个对象。)
1:基本类型
   ex: String、Number、Boolean、Null、Undefined.
2:引用类型
   ex:Object、Arry、 Function

浅拷贝:改变拷贝对象的值,原拷贝对象值也会改变。因对象存储在堆内存,浅拷贝只是复制了指向对象值的指针。深拷贝:即使改变拷贝之后对象的属性值,但原始对象值不会改变

let obj1={
    age:17,
    sex:"woman",
    address:{
        city:'shenzhen'
    },
    arr:[1997,"百度",2000,"alibaba"]
}
let obj2=obj1;
console.log("obj2:",obj2)
obj2.age=34;
console.log("改变obj2的age值之后","obj1:",obj1);
console.log("改变obj2的age值之后","obj2:",obj2);
shallowClone.png

二:如何深拷贝?

function deepClone(cloneObj) {
    if(typeof cloneobj!=="object"||cloneobj==null){
        return cloneobj
    }
    //初始返回结果
    let  result
    if(cloneobj instanceof Array){
        result=[]
    }else{
        result={}
    }
    for(let key in cloneobj){
        //保证key不是原型的属性
       if(cloneobj.hasOwnProperty(key)){
           //递归调用
         result[key]=deepClone(cloneobj[key])
       }
    }
    return result
}
let obj1={
    age:17,
    sex:"woman",
    address:{
        "province":"广东",
        "city":"深圳"
    }
}
let obj2=deepClone(obj1);
console.log('obj1:',obj1)
console.log('obj2:',obj2)
obj2.address.province="陕西";
obj2.address.city="西安";
console.log('改变obj2的city之后','obj1:',obj1)
console.log('改变obj2的city之后','obj2:',obj2)
deepClone.png

你可能感兴趣的:(2020-07-07 deepclone,我要深拷贝。)