JavaScript浅拷贝和深拷贝

JavaScript有两种数据类型:简单数据类型和复杂数据类型(对象类型)

简单数据类型:保存在栈内存中的简单数据段,有undefined,boolean,number,string,null。
复杂数据类型:对象(Object)、数组(Array)、函数(Function),保存在堆内存空间中。

从结构分类:值类型和引用类型

值类型一般指的就是简单数据类型,引用类型指的就是对象类型。
浅拷贝:
如果属性的值是基本类型,拷贝的基本类型的值;如果属性的值是内存地址(引用类型),拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

浅拷贝:

var obj1 = {
            name: 'zhangsan',
            age: '18',
            language: {
                name: '中文'
            }
        };
        var arr = [1, 3, {
            username: 'kobe'
        }];
        `````````````````````````
    //浅拷贝方法一

    /* function shallowCopy(src) {
        var newObj = {}
        for (var prop in src) {
            if(src.hasOwnProperty(prop)){   //获取私有属性,不包括原型上的属性
                newObj[prop]=src[prop]
            }   
        }
        return newObj
    }
    var obj2 = shallowCopy(obj1)

二方法用于对象  Object.assign()
````````
     //浅拷贝方法二
     //var obj2=Object.assign({},arr)
```````
三、四方法只针对于数组对象  
````````
     //浅拷贝方法三  Array.prototype.concat()
     // var arr2 = arr.concat()

     //浅拷贝方法四  Array.prototype.slice()
     // var arr2=arr.slice()
     

深拷贝

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

原理:需要将原始对象的属性的值都为引用类型的都需要进行拷贝,不管多少层,直到属性的值为基本数据类型为止。

   var obj = {
            name: '铁蛋',
            dog: {
                name: '大黄',
                age: 3,
                sex: '女',
                bobbies: ['钢琴', '下棋', '阅读', '画画']
            },
            eat: function () {
                console.log(this.dog.name + '西红柿炒番茄');
            }
        }

        function checkedType(target) {
            return Object.prototype.toString.call(target).slice(8, -1)
        }

       function deepCopy(oldObj,newObj){
           for(var key in oldObj){
               var item=oldObj[key]
               if(checkedType(item)==='Object'||checkedType(item)==='Array'){
                   newObj[key]={}
                   deepCopy(item,newObj[key])
               }else{
                   newObj[key]=item
               }
           }
           return newObj
       }
        var obj1={}
        deepCopy(obj,obj1)
       
`````````````````````````````````````````````````````````````````````````````````````````````````````
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容