js深拷贝和浅拷贝

148 阅读1分钟

var a =123; var b =a; // 这就是b拷贝了a // 浅拷贝: 就只拷贝了地址

    //   拷贝目的   就是  复制数据
    //   浅拷贝原因是只有一个数据,内存中只有一个地址


    //   数据存放在内存中,内存分为 栈 和 堆
    //  数组,对象,函数  都是放在堆中的,都是存在一个地址
    //   基本类型数据 在栈中  赋值为的是数据 或者指针

    // 基本类型数据拷贝  是深拷贝
    //  引用类型   浅拷贝
    
    
    
    
    		复杂结构深拷贝
    
    var dataa = [
        {name:'aa',list:[
            {name:'bb'}
        ]}
    ]
    

    function reCopy(data){
        if(Array.isArray(data)){
            var res = [];
            for(var i =0;i<data.length;i++){
                if(data[i] instanceof Object){
                    var copy = reCopy(data[i]);
                    res.push(copy);
                }else{
                    res.push(data[i]);
                }
            }
            return res;
        } else if(data.constructor ===Object){
            var res = {};
            for(var x in data){
                if(data[x] instanceof Object){
                    var copy = reCopy(data[x]);
                    res[x] = copy;
                }else{
                    res[x] = data[x];
                }
            }
            return res;
        }
    }
    reCopy(dataa);
    
    
    深拷贝对象
    var obj = {
        name: 'aaa',
        age: 123,
        a: {
            aa: 'aa',
            bb: 'bb',
        }
    }
    function deepCopy(obj) {
        var result = {};
        for (var x in obj) {
            if (obj[x].hasOwnproperty === Object) {
                result[x] = deepCopy(obj[x]);
            }
            else {
                result[x] = obj[x];

            }
        }
        return result;
    }
    console.log(deepCopy(obj));
    
    
    使用三目运算符的方法
    var res = {
            dog:1,
            age:5,
            data:[1,5,1,4,6],
        };
    function deepCopy(obj){
        if(typeof obj !=='object'){
            return;
        }
        var newObj = obj instanceof Array? []:{};
        for(var x in obj){
            newObj[x] = typeof obj[x] === 'object' ? deepCopy(obj[x]) : obj[x];
        }
        return newObj;
    }
    console.log(deepCopy(res));