JS----深拷贝与浅拷贝

参考学习:https://blog.csdn.net/baidu_36065997/article/details/80309991
https://www.cnblogs.com/echolun/p/7889848.html
在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。
深拷贝:
数组:
法一:for循环

let arr1 = [1,2,3];
let arr2 = copyArr(arr1);
function copyArr(arr){
    let res=[];
    for(let i=0,length=arr.length;i<length;i++){
        res.push(arr[i]);
    }
    return res;
}

法二: slice

let arr1 = [1,2,3];
let arr2 = arr1.slice(0);

法三: concat

let arr1 = [1,2,3];
let arr2 = arr1.concat();

法四:扩展运算符

let arr1 = [1,2,3];
let [...arr2] = arr1;

法五:Array.from
如果参数是一个真正的数组,Array.from会返回一个一模一样的新数组

    let arr1 = [1,2,3];
    let arr2 = Array.from(arr1);

对象
法一:for循环

let obj1={count:1,name:'grace',age:1};
let obj2 = copyObj(obj){
let res = {};
for(let key in obj){
  res[key]=obj[key];
}
return res;
}

法二:利用JSON

    let obj1={count:1,name:'grace',age:1};
    let obj2 = JSON.parse(JSON.stringify(obj1));**

法三:扩展运算符

    let obj1={count:1,name:'grace',age:1};
    let {...obj2} = obj1;

可以实现数组和对象的深拷贝

function deepCopy(obj){
        let result = Array.isArray(obj)?[]:{};  
        if(obj && typeof obj === 'object'){ 
            for(let key in obj){
                if(obj.hasOwnProperty(key)){
                    if(obj[key]&&typeof obj[key]==='object'){
                        result[key]=deepCopy(obj[key]);
                    }else{
                        result[key]=obj[key];
                    }
                }
            }
        }
        return result;
    }

我们还可以借用JQ的extend方法。

注意:ES6新增了Object.assign() 方法

posted @ 2019-04-23 17:20  princeness  阅读(115)  评论(0编辑  收藏  举报