溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

js的深拷貝是什么

發(fā)布時(shí)間:2022-03-04 11:33:02 來源:億速云 閱讀:131 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“js的深拷貝是什么”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“js的深拷貝是什么”這篇文章吧。

    js深拷貝

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

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

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

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

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

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

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

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

    存儲(chǔ)如下圖:

    js的深拷貝是什么

    什么是淺/深拷貝

    講完存儲(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)

    js的深拷貝是什么

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

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

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

    js的深拷貝是什么

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

    那么我們?cè)谫x值引用類型的時(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]='長(zhǎng)沙'
         console.log("arr為", arr)
         console.log("brr為", brr)

    js的深拷貝是什么

    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]='長(zhǎng)沙'
         console.log("arr為", arr)
         console.log("brr為", brr)

    js的深拷貝是什么

    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] = '長(zhǎng)沙'
         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;
         }

    js的深拷貝是什么

    以上是“js的深拷貝是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    js
    AI