最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

帶你搞懂js的深拷貝

 更新時(shí)間:2021年11月15日 16:01:01   作者:浪漫主義碼農(nóng)  
這篇文章主要為大家介紹了js的深拷貝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

js深拷貝

在講正題之前我們要先了解數(shù)據(jù)存儲(chǔ)的方式

數(shù)據(jù)存儲(chǔ)方式

在講之前我們要先知道值類型和引用類型的存儲(chǔ)方式。

在JavaScript數(shù)據(jù)類型中有兩種數(shù)據(jù)類型。

值類型:字符串(String)、數(shù)字 (Number)、布爾 (Boolean)、空(Null)、未定義(Undefined)、Symbol。

存放在棧內(nèi)存中的簡單數(shù)據(jù)段,數(shù)據(jù)大小確定,內(nèi)存空間大小可以分配。

引用數(shù)據(jù)類型:對(duì)象 (Object) 、數(shù)組 (Array) 、函數(shù) (Function) 。

存放在堆內(nèi)存中的對(duì)象,在棧內(nèi)存中存的是一個(gè)指針,這個(gè)指針指向堆內(nèi)存一個(gè)位置。再從堆內(nèi)存中取得所需的數(shù)據(jù)。

存儲(chǔ)如下圖:

在這里插入圖片描述

什么是淺/深拷貝

講完存儲(chǔ)的方式,我們來講講淺拷貝和深拷貝

拷貝也就是我們常常講的copy,ctrl+c,ctrl+v,那么我們來看看例子

當(dāng)我們對(duì)分別值類型和引用類型進(jìn)行賦值。

     var a = 5
     var b = a
     b += 5
     console.log('a=' + a,'b=' + b)
     var arr=[1,2,3]
     var brr=arr
     brr.push(10)
     console.log("arr為",arr)
     console.log("brr為",brr)

在這里插入圖片描述

現(xiàn)象:我們發(fā)現(xiàn)值類型并沒有互相受到影響,然而數(shù)組(引用類型)brr數(shù)組添加元素的時(shí)候改變了arr數(shù)組。

解釋分析:淺拷貝只會(huì)發(fā)生在引用類型身上,對(duì)于引用類型如果之進(jìn)行簡單的賦值,只會(huì)賦值指向堆內(nèi)存的指針,這種稱為淺拷貝。而深拷貝就是完全拷貝一個(gè)引用類型,為不是地址指針。

淺拷貝看下面這張?jiān)韴D:

在這里插入圖片描述

常用深拷貝實(shí)現(xiàn)

那么我們在賦值引用類型的時(shí)候肯定不能出現(xiàn)淺拷貝的現(xiàn)象,對(duì)原數(shù)據(jù)產(chǎn)生影響了。那么就要進(jìn)行深拷貝

1.通過JSON.stringify和JSON.parse

可以深拷貝的數(shù)組和對(duì)象,但是不能拷貝函數(shù),可以進(jìn)行對(duì)象或者數(shù)組的嵌套拷貝。

缺點(diǎn):無法實(shí)現(xiàn)對(duì)對(duì)象中方法的深拷貝

使用

     var brr=JSON.parse(JSON.stringify(arr))

例子:

  var arr = {
         name: '浪漫主義碼農(nóng)',
         age: 20,
         adress: ['jiangxi', 'changsha'],
         friends: {
             friend1: '張三',
             friend2: '李四'
         },
         function(){
             console.log("我是浪漫主義的對(duì)象")
         }
     }
     var brr=JSON.parse(JSON.stringify(arr))
     brr.name='法外狂徒張三'
     brr.adress[0]='長沙'
     console.log("arr為", arr)
     console.log("brr為", brr)

在這里插入圖片描述

2.擴(kuò)展運(yùn)算符

利用了對(duì)象的結(jié)構(gòu)賦值特性方法。

缺點(diǎn):無對(duì)對(duì)象里面嵌套的對(duì)象進(jìn)行深拷貝,相當(dāng)于只是對(duì)一層引用對(duì)象進(jìn)行深拷貝

使用:

     var brr={...arr}

例子:

  var arr = {
         name: '浪漫主義碼農(nóng)',
         age: 20,
         adress: ['jiangxi', 'changsha'],
         friends: {
             friend1: '張三',
             friend2: '李四'
         },
         function(){
             console.log("我是浪漫主義的對(duì)象")
         }
     }
     var brr={...arr}
     brr.name='法外狂徒張三'
     brr.adress[0]='長沙'
     console.log("arr為", arr)
     console.log("brr為", brr)

在這里插入圖片描述

3.手寫遞歸深拷貝函數(shù)

完美解決

函數(shù):

  //使用遞歸實(shí)現(xiàn)深拷貝
     function deepClone(obj) {
         //判斷拷貝的obj是對(duì)象還是數(shù)組
         var objClone = Array.isArray(obj) ? [] : {};
         if (obj && typeof obj === "object") { //obj不能為空,并且是對(duì)象或者是數(shù)組 因?yàn)閚ull也是object
             for (key in obj) {
                 if (obj.hasOwnProperty(key)) {
                     if (obj[key] && typeof obj[key] === "object") { //obj里面屬性值不為空并且還是對(duì)象,進(jìn)行深度拷貝
                         objClone[key] = deepClone(obj[key]); //遞歸進(jìn)行深度的拷貝
                     } else {
                         objClone[key] = obj[key]; //直接拷貝
                     }
                 }
             }
         }
         return objClone;
     }

例子:

      var arr = {
         name: '浪漫主義碼農(nóng)',
         age: 20,
         adress: ['jiangxi', 'changsha'],
         friends: {
             friend1: '張三',
             friend2: '李四'
         },
         fun: function(){
             console.log("我是" + this.name + "的對(duì)象")
         }
     }
     var brr = deepClone(arr)
     brr.name = '法外狂徒張三'
     brr.adress[0] = '長沙'
     console.log("arr為", arr)
     arr.fun()
     console.log("brr為", brr)
     brr.fun()
 ​
     //使用遞歸實(shí)現(xiàn)深拷貝
     function deepClone(obj) {
         //判斷拷貝的obj是對(duì)象還是數(shù)組
         var objClone = Array.isArray(obj) ? [] : {};
         if (obj && typeof obj === "object") { //obj不能為空,并且是對(duì)象或者是數(shù)組 因?yàn)閚ull也是object
             for (key in obj) {
                 if (obj.hasOwnProperty(key)) {
                     if (obj[key] && typeof obj[key] === "object") { //obj里面屬性值不為空并且還是對(duì)象,進(jìn)行深度拷貝
                         objClone[key] = deepClone(obj[key]); //遞歸進(jìn)行深度的拷貝
                     } else {
                         objClone[key] = obj[key]; //直接拷貝
                     }
                 }
             }
         }
         return objClone;
     }

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論

罗江县| 福泉市| 中西区| 天门市| 武义县| 斗六市| 伊春市| 晋宁县| 富阳市| 疏勒县| 洞口县| 商洛市| 丽水市| 吐鲁番市| 黄龙县| 金坛市| 芦溪县| 张掖市| 灌南县| 汪清县| 沭阳县| 金川县| 通渭县| 泾源县| 清镇市| 万源市| 金阳县| 来凤县| 突泉县| 张北县| 永仁县| 宁都县| 塔城市| 衡东县| 平谷区| 荣昌县| 襄汾县| 湘乡市| 蓬安县| 敖汉旗| 淮南市|