成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS中的深拷貝與淺拷貝

ARGUS / 1850人閱讀

摘要:中的深拷貝與淺拷貝說到深淺拷貝的時(shí)候就不得不說一下中的變量類型了基本類型按值存放在棧內(nèi)存中的簡單數(shù)據(jù)段可以直接訪問引用類型存放在堆內(nèi)存中的對象變量保存的是一個(gè)指向存放數(shù)據(jù)位置的指針訪問引用類型的值時(shí)首先從棧中獲取到存放該數(shù)據(jù)位置的指針然后再

JS中的深拷貝與淺拷貝

說到深淺拷貝的時(shí)候就不得不說一下JS中的變量類型了:

基本類型: undefined、null、boolean、numberstring, 按值存放在棧內(nèi)存中的簡單數(shù)據(jù)段, 可以直接訪問.

引用類型: 存放在堆內(nèi)存中的對象, 變量保存的是一個(gè)指向存放數(shù)據(jù)位置的指針. 訪問引用類型(object, array)的值時(shí), 首先從棧中獲取到存放該數(shù)據(jù)位置的指針, 然后再從堆中取得數(shù)據(jù).

__淺拷貝__: 淺拷貝是拷貝引用, 拷貝后的引用都是指向同一個(gè)存放數(shù)據(jù)位置的指針, 無論操作哪一個(gè)都是在操作指向在堆中的那一個(gè)數(shù)據(jù), 所以雙方都會(huì)有影響.

__深拷貝__: 在堆中重新分配內(nèi)存, 將源對象的各個(gè)屬性復(fù)制進(jìn)去. 對拷貝對象和源對象各自操作互不影響.

淺拷貝

淺拷貝分兩種情況, 拷貝源對象的引用和源對象拷貝實(shí)例, 但其屬性拷貝引用.
拷貝源的引用
eg:

let obj1 = {
    a: 1
};
let obj2 = obj1;

console.log(obj1 === obj2); // true

obj1.a = 2;

console.log(obj2.a); // 2

源對象拷貝實(shí)例, 其屬性對象拷貝引用
外層源對象是拷貝實(shí)例, 但是如果源對象的屬性元素為復(fù)雜數(shù)據(jù)類型時(shí), 內(nèi)層元素拷貝引用. 對源對象操作時(shí)不影響拷貝對象. 但對其屬性操作時(shí), 會(huì)改變拷貝對象屬性的值. 常用方法: Array.prototype.slice(), Array.prototype.concat(), jQuery$.extend({}, obj), Object.assign()等. eg:

let obj1 = {
    a: 1,
    b: [1, 2, 3],
    c: {
        c1: 1
    }
};

let obj2 = Object.assign({}, obj1);
obj2.a = 2;
obj2.b[0] = 2;
obj2.c.c1 = 10
console.log(obj1);
/**
輸出結(jié)果:
{
    a: 1, 
    b: [2, 2, 3],
    c: {
        c1: 10
    }
}
**/

這上面的例子中obj1為源對象, obj2為拷貝對象. 拷貝后修改拷貝對象的屬性a沒有影響到源對象, 修改拷貝對象的復(fù)雜數(shù)據(jù)類型屬性b, c后影響到源對象.

深拷貝

深拷貝過后, 源對象、拷貝對象包括其內(nèi)部元素(包括復(fù)雜類型元素)都不互相干擾. 常見方法有JSON.parse(JSON.stringify(obj)), jQuery$.extend(true, {}, obj), lodash_.cloneDeep_clone(value, true). eg:

let obj1 = {
    a: 1,
    b: [1, 2, 3],
    c: {
        c1: 1
    }
};

let obj2 = JSON.parse(JSON.stringify(obj1));

obj2.a = 2;
obj2.b[0] = 2;
obj2.c.c1 = 10
console.log(obj1);
/**
輸出結(jié)果:
{
    a: 1, 
    b: [1, 2, 3],
    c: {
        c1: 1
    }
}
**/

最后輸出源對象(obj1) 得到結(jié)果是源對象未變化.
深拷貝就是增加一個(gè)指針(棧內(nèi)存)申請一個(gè)新的堆內(nèi)存, 并讓這個(gè)指針指向這個(gè)堆內(nèi)存. 當(dāng)我們需要復(fù)制源對象而又不能修改源對象的時(shí)候, 深拷貝就是你想要的.

那么是時(shí)候自己實(shí)現(xiàn)一個(gè)深拷貝方法了:

function deepclone(sObj, cObj) {
    cObj = cObj || (Array.isArray(sObj) ? [] : {});

    for(let i in sObj) {
        if(typeof sObj[i] === "object") {
            cObj[i] = Array.isArray(sObj[i]) ? [] : {};
            deepclone(sObj[i], cObj[i])
        } else {
            cObj[i] = sObj[i]
        }
    };

    return cObj;
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108253.html

相關(guān)文章

  • JS 的深拷貝與淺拷貝

    摘要:什么是深拷貝淺拷貝見名知義,無論是深拷貝還是淺拷貝,都是的問題。使用如下以上就是關(guān)于中的深拷貝與淺拷貝的知識(shí)和如何進(jìn)行深拷貝的知識(shí)了,如果有錯(cuò)或者有其他方式的話,歡迎在下面留言評論啦 前言 最近在寫項(xiàng)目的時(shí)候涉及到一些父子組件傳遞個(gè)對象或者數(shù)組通信啥的,或者是直接復(fù)制添加對象啥的,直接使用賦值的時(shí)候總會(huì)出錯(cuò)。一查原來是淺拷貝的問題,就從網(wǎng)上找了點(diǎn)資料,匯總到這里來了。 1 什么是深拷貝...

    ztyzz 評論0 收藏0
  • JS的深拷貝與淺拷貝

    摘要:深拷貝和淺拷貝最根本的區(qū)別在于是否是真正獲取了一個(gè)對象的復(fù)制實(shí)體,而不是引用,深拷貝在計(jì)算機(jī)中開辟了一塊內(nèi)存地址用于存放復(fù)制的對象,而淺拷貝僅僅是指向被復(fù)制的內(nèi)存地址,如果原地址中對象被改變了,那么淺拷貝出來的對象也會(huì)相應(yīng)改變。 深拷貝和淺拷貝最根本的區(qū)別在于是否是真正獲取了一個(gè)對象的復(fù)制實(shí)體,而不是引用, 深拷貝在計(jì)算機(jī)中開辟了一塊內(nèi)存地址用于存放復(fù)制的對象, 而淺拷貝僅僅是指向被...

    wuyumin 評論0 收藏0
  • 低門檻徹底理解JavaScript的深拷貝和淺拷貝

    摘要:案例中的賦值就是典型的淺拷貝,并且深拷貝與淺拷貝的概念只存在于引用類型。修改修改經(jīng)測試,也只能實(shí)現(xiàn)一維對象的深拷貝。經(jīng)過驗(yàn)證,我們發(fā)現(xiàn)提供的自有方法并不能徹底解決的深拷貝問題。 在說深拷貝與淺拷貝前,我們先看兩個(gè)簡單的案例: //案例1 var num1 = 1, num2 = num1; console.log(num1) //1 console.log(num2) //1 num...

    wind3110991 評論0 收藏0
  • 淺談深拷貝和淺拷貝

    摘要:而引用類型值是指那些保存堆內(nèi)存中的對象,意思是變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針指向內(nèi)存中的另一個(gè)位置,該位置保存對象。而堆內(nèi)存主要負(fù)責(zé)對象這種變量類型的存儲(chǔ)。我們需要明確一點(diǎn),深拷貝與淺拷貝的概念只存在于引用類型。 深拷貝和淺拷貝 說起深拷貝和淺拷貝,首先我們來看兩個(gè)栗子 // 栗子1 var a = 1,b=a; console.log(a); console.log(b) ...

    littleGrow 評論0 收藏0
  • javascript的深拷貝VS淺拷貝

    摘要:深拷貝淺拷貝本文主要對深拷貝淺拷貝的解釋及實(shí)現(xiàn)做一下簡單記錄。之所以會(huì)有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)區(qū)域不一樣。但注意,只能做一層屬性的淺拷貝。 深拷貝VS淺拷貝 本文主要對深拷貝&淺拷貝的解釋及實(shí)現(xiàn)做一下簡單記錄。原文鏈接,歡迎star。 之所以會(huì)有深拷貝與淺拷貝之分,是因?yàn)椴煌瑪?shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的存儲(chǔ)區(qū)域不一樣。 堆和棧是計(jì)算機(jī)中劃分出來用來存儲(chǔ)的...

    Nekron 評論0 收藏0

發(fā)表評論

0條評論

ARGUS

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<