首页技术文章正文

深拷贝与浅拷贝【黑马web前端】

更新时间:2019年07月26日 11时15分35秒 来源:黑马程序员论坛

        基本数据类型(Undefined,Null,Boolean,Number和String)
        他们的值在内存中占据着固定大小的空间,并被保存在栈内存中。当一个变量向另一个变量复制基本类型的值,会创建这个值的副本,并且我们不能给基本数据类型的值添加属性

        var x = 1;
        var y = x;
        x.name = 'aaa';
        console.log(x);//1
        console.log(y); //1
        console.log(x.name); //undefined



        复制数据类型
        复杂的数据类型即是引用类型,它的值是对象,保存在堆内存中,引用类型值的变量实际上包含的不是对象本身,而是一个指向该对象的指针。
        从一个变量向另一个变量复制引用类型的值,复制的其实是指针地址而已,因此两个变量最终都指向同一个对象



        浅拷贝



        var obj = {
            name:'zhangsan',
            age: 22
        }
        var obj2 = obj;
        obj2['c'] = 5;
        console.log(obj);  
        console.log(obj2);


        var arr = [1, 2, 3, 4];
        var arr2 = arr;
        arr2[1] = "aaa";
        console.log(arr);
        console.log(arr2);


--------------------------------------------------------------------------


        深拷贝
        数组

        arr1=[1,2,3,4,5]
        arr2=[]
        function deepCopy(arr1, arr2) {
            for (var i = 0; i < arr1.length; i++) {
                arr2[i] = arr1[i];
            }
        }
        deepCopy(arr1,arr2)
        arr2[0]= 111
        console.log(arr1)
        console.log(arr2)



        //1.slice()

        var arr = ['a', 'b', 'c'];
        var arrCopy = arr.slice(0);
        arrCopy[0] = 'aaa'
        console.log(arr); // ["a", "b", "c"]
        console.log(arrCopy); // ["aaa", "b", "c"]

        //2.concat()

        var arr = ['a', 'b', 'c'];
        var arrCopy = arr.concat();
        arrCopy[0] = 'test'
        console.log(arr); // ["a", "b", "c"]
        console.log(arrCopy); // ["test", "b", "c"]




        对象

        var obj = {
            name:'zhangsan',
            age: 22
        }
        var obj2 = new Object;
        obj2.name = obj.name;
        obj2.age = obj.age

        obj.name = 'lisi';
        console.log(obj);
        console.log(obj2);


        var obj = {
            name: 'aaa',
            age: 22
        }

        var a = [111,222,333]

        function copy(oldObj){
            let newObj = {};
            if (oldObj instanceof Array){
                newObj = [];
            };
            for (let key in oldObj){
                let value = oldObj[key];
                if (typeof value === "object" && value !== null){//如果原对象的某个属性是复制数据类型,递归调用copy
                    newObj[key] = copy(value);
                } else{//如果原对象的某个属性是基本数据类型,直接将此属性赋值给新对象的相应属性
                    newObj[key] = value;
                }
            };
            return newObj;
    }
        var objCopy = copy(obj)
        obj.name = 'bbb';
        console.log(obj);
        console.log(objCopy);

        var b = copy(a)
        console.log(b)


        // 使用JSON.stringify()和JSON.parse()也可以实现深拷贝。当值为undefined、任意函数、symbol时会被忽略。
        var obj = {
            a: 1,
            b: 2,
            fn:function(){
                console.log(1)
            }
        }
        let newobj = JSON.parse(JSON.stringify(obj));
        newobj.a = 3
        console.log(obj)
        console.log(newobj)





        es6 assign()  Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

        var obj = {
            a: 1,
            b: 2,
            c:{
                d:1
            }
        }

        var obj2 = Object.assign({},obj)
        // obj2.a = 111
        obj2.c.d = 111

        console.log(obj)
        console.log(obj2)

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!