深拷贝+浅拷贝,及深拷贝的几种实现方式

  1. ------深拷贝 :拷贝对象的具体内容,内存地址是自主分配的,拷贝结束后两个对象虽然存的值一样,但是内存地址不一样
  2. ------浅拷贝 :对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。注意:当内存销毁的时候,指向对象的指针 ,必须重新定义,才能够使用(浅拷贝是一个传址,也就是把a的值赋给b的时候同时也把a的址赋给了b, 当b(a)的值改变的时候,a(b)的值同时也会改变)
  3. ------什么是引用数据类型? 引用数据类型有哪些 (对象,数组,function,map,set);而引用数据类型就会出现深浅复制
  4. ------深拷贝实现方法有以下几种:
    1  递归的方法
        function deepClone1(obj) {
        let objClone = Array.isArray(obj) ? [] : {};
        if(obj && typeof obj === 'object'){
            for(let key in obj){
                if(obj[key] && typeof obj[key] === 'object'){
                    objClone[key] = deepClone1(obj[key]); //循环递归直到属性不为一个object为止
                }else{
                    objClone[key] = obj[key];
                }
            }
        }
        return objClone;
    }
    let person1 = {
        name:'园丁',
        job:{
            salary:50000,
            address:'高新',
            id:{
                idCard:5003888
            }
        }
    };
    let person2 = deepClone2(person1);
    console.log(person1);
    console.log(person2);
    let arr1 = [
        1,
        2,
        [3,4],
        5
    ];
    let arr2 = deepClone1(arr1);
    console.log(arr1);
    console.log(arr2);
    console.log(arr1 === arr2); //false
    console.log(person1 === person2); //false
    说明深拷贝得到的不是同一个对象
    2.使用json对象的方法
    //  通过json对象实现深拷贝
    // JSON.stringify() 【从一个对象中解析出字符串】
    // JSON.parse() 【从一个字符串中解析出对象】
    function deepClone2(obj){
        let _obj = JSON.stringify(obj);
        console.log(_obj);
        let objClone = JSON.parse(_obj);
        console.log(objClone);
        return objClone;
    }
    let person3= deepClone2(person1);
    3.Object.assign()方法
    // 这个方法去复制  对象只有一级属性的时候此方法为深复制
    // 在有二级属性的时候  为浅复制二级属性
    let person4 = Object.assign({},person1);
    console.log(person4);
    
    4.jq 的extend方法
    let arr3 = $.extend(true,[],arr1);
    console.log(arr3);

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值