js中的深淺拷貝

(1)關(guān)于兩種數(shù)據(jù)類型

數(shù)據(jù)類型:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型

基本數(shù)據(jù)類型包括以下

  • Undefined
  • Null
  • Boolean
  • Number
  • String

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

  • 基本數(shù)據(jù)類型存儲在棧內(nèi)存
  • 引用數(shù)據(jù)類型類型存儲在堆內(nèi)存中
var a = 1;//定義了一個number類型
var obj1 = {//定義了一個obj類型
    name:'obj'
};
代碼執(zhí)行后,內(nèi)存空間如下

這時候變量值obj1保存在??臻g中,真正對象保存在堆空間,我們只是通過變量中的引用類型的地址類操作實際對象
這時候我們接著執(zhí)行下列代碼:

    var obj2 = obj1
    obj2.name='obj2'
    console.log(obj1)

我們發(fā)現(xiàn)這時候改變obj2中的name值,打印obj1的時候,發(fā)現(xiàn)obj1的name值也被改變了.

導(dǎo)致這一現(xiàn)象的原因是:

我們只是復(fù)制了一次引用類型的地址,所以,不管接下來我們是操作obj1還是obj2,本質(zhì)上都是操作同一個對象。

深復(fù)制和淺復(fù)制

淺拷貝

淺拷貝:不能深層次的復(fù)制,如果對象里面有對象話,就實現(xiàn)不了復(fù)制

淺拷貝方法一
  var obj2 = {}
    for (const key in obj1) {
        obj2[key]=obj1[key]
    }
    console.log(obj2)
淺拷貝方法二
 var obj2 = Object.assign({},obj1)
    console.log(obj2)
淺拷貝方法三
  var obj2 = {...obj1}
    console.log(obj2)
深拷貝
一.遞歸實現(xiàn)深拷貝

(1)首先使用instanceof判斷深拷貝對象是數(shù)組還是對象
(2)關(guān)于Object.entries(obj)方法

 let a = ['張三','李四']
    console.log(JSON.stringify(Object.entries(a),null,2))
    let b = {name:'張三',title:'李四'}
    console.log(JSON.stringify(Object.entries(b),null,2))
打印返回的數(shù)據(jù)結(jié)果

(3)

 function deepCopy(obj) {
        let res = obj instanceof Array ? [] : {}
        for (const [k, v] of Object.entries(obj)) {
            res[k] = typeof v == "object" ? deepCopy(v) : v
        }
        return res
    }

調(diào)用函數(shù)驗證結(jié)果

  let arr = [11, 33, [1, 2, 3], 55, 77, 99]
    console.dir(arr)
    let arr1 = deepCopy(arr)
    arr1[2][2] = 4
    console.dir(arr1)
驗證成功
二.使用JSON對象的stringify和parse方法

不拷貝引用對象,拷貝一個字符串會新辟一個新的存儲地址,這樣就切斷了引用對象的指針聯(lián)系。

var a=[1,2,3]
var b=JSON.parse(JSON.stringify(a));
b.push(4);
console.log(b);//1,2,3,4
console.log(a)//1,2,3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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