浅拷贝和深拷贝 新手理解

 // 深拷贝和浅拷贝
        // 一、首先要清楚知道数据的数据类型
        // 二、明白存储方式    基本数据存储在栈中,引用数据类型存储在堆中
        // 三、基本数据不存在浅拷贝和深拷贝   但是(相当于深拷贝)
 
 

        //对数组的拷贝
        // 一、 数组中不存在引用对象   
        // 深拷贝和浅拷贝结果相同
        var arr = [1, 2, 3, 4, 5, 6]
        var cloneArr = simpleClone(arr);
        var arr1 = arr.slice();
        var arr2 = arr.concat([]);
        var arr3 = arr;
        console.log(cloneArr == arr);//flase
        console.log(arr1 == arr);//false
        console.log(arr2 == arr);//false
        console.log(arr3 == arr); //true
        // 对于arr3  arr3得到的是arr的指针 arr3和arr指向堆中同一个数据数以相等
        // 相互之间不会影响

        // 二、 数组中存在引用对象
        // var arr = [{ name: "arr" }, 1, 2, 3,4, 5];
        console.log(cloneArr == arr);//flase
        console.log(arr1 == arr);//false
        console.log(arr2 == arr);//false
        console.log(cloneArr[0] == arr[0]);//true
        console.log(arr1[0] == arr[0]);//true
        console.log(arr2[0] == arr[0]);//true
        // 数组中的对象不是真正的对象 而是原数组中对象所对应的指针(相当于房子的钥匙)
        //   所以新数组中的对象还是存储在堆内存中的那个数据  所以是ture

        // 对象的拷贝
        // 一、object 的浅拷贝   和数组基本相同   
        var obj = {
            name: "obj",
            friend: ["小明", "小红"]
        }
        // 第一种方法
        var obj1 = obj;
        obj1.say = function () {
            console.log(this.name);
        }   //给obj1添加一个say方法
        console.log(obj);//也会有say方法
        // 第二种方法
        var simpleObj = simpleClone(obj);
        console.log(simpleObj.name == obj.name);//ture
        console.log(simpleObj == obj); // false
        console.log(simpleObj.friend == obj.friend); // true
        //和数组中解释一样  属性中的数据  存储的是数据的指针 而不是数据的本身  所以指向相同的数据
        // 第三种方法
        var extendobj = {}
        // Object.assign(目标函数,函数 ,{新加属性})  新加属性可加可不加 如果新加属性相同 会覆盖前属性值 
        var returnObj = Object.assign(extendobj, obj, { name: "extendobj" })
        console.log(returnObj === extendobj); // true
        // 对象的深拷贝
        // JSON.parse(JSON.stringify(object))可以实现深拷贝   但会丢失函数   所以一般用于处理数据
        // 利用json.stringify将js对象序列化(就是转换成json字符串存储到硬盘上),在使用json.parse反序列化(还原)js对象 
        var jsonObj = JSON.parse(JSON.stringify(obj));
        console.log(jsonObj === obj); // false
        console.log(jsonObj.friend === obj.friend); // false
        // 自己写函数做深克隆
        var deepCloneObj = deepClone(obj);
        console.log( deepCloneObj === obj); // false
        console.log( deepCloneObj.friend === obj.friend); // false
        //浅拷贝函数
        function simpleClone(param) {
            var newParam = param instanceof Array ? [] : {};
            for (var i in param) {
                newParam[i] = param[i];
            }
            return newParam;
        }
        //深克隆函数
        function deepClone(param){
            if(param === null){
                return null;
            }
            var newParam = param instanceof Array ? [] : {};
            for(var i in param){
                newParam[i] = typeof param[i] === "object" ? deepClone(param[i]) : param[i];
            }
            return newParam;
        }
posted @ 2020-09-03 21:15  小昆的博客  阅读(90)  评论(0)    收藏  举报