JavaScript淺拷貝和深拷貝

JavaScript有兩種數(shù)據(jù)類型:簡(jiǎn)單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型(對(duì)象類型)

簡(jiǎn)單數(shù)據(jù)類型:保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段,有undefined,boolean,number,string,null。
復(fù)雜數(shù)據(jù)類型:對(duì)象(Object)、數(shù)組(Array)、函數(shù)(Function),保存在堆內(nèi)存空間中。

從結(jié)構(gòu)分類:值類型和引用類型

值類型一般指的就是簡(jiǎn)單數(shù)據(jù)類型,引用類型指的就是對(duì)象類型。
淺拷貝:
如果屬性的值是基本類型,拷貝的基本類型的值;如果屬性的值是內(nèi)存地址(引用類型),拷貝的就是內(nèi)存地址,因此如果其中一個(gè)對(duì)象改變了這個(gè)地址,就會(huì)影響到另一個(gè)對(duì)象。

淺拷貝:

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)

二方法用于對(duì)象  Object.assign()
````````
     //淺拷貝方法二
     //var obj2=Object.assign({},arr)
```````
三、四方法只針對(duì)于數(shù)組對(duì)象  
````````
     //淺拷貝方法三  Array.prototype.concat()
     // var arr2 = arr.concat()

     //淺拷貝方法四  Array.prototype.slice()
     // var arr2=arr.slice()
     

深拷貝

深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象。

原理:需要將原始對(duì)象的屬性的值都為引用類型的都需要進(jìn)行拷貝,不管多少層,直到屬性的值為基本數(shù)據(jù)類型為止。

   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)
       
`````````````````````````````````````````````````````````````````````````````````````````````````````
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容