什么是深拷貝和淺拷貝?如何實(shí)現(xiàn)深拷貝

深拷貝和淺拷貝是針對(duì)引用類(lèi)型的

淺拷貝:
簡(jiǎn)單來(lái)說(shuō)就是一個(gè)對(duì)象B復(fù)制另一個(gè)對(duì)象A,當(dāng)改變B對(duì)象的值是A對(duì)象的值也隨之改變。
舉個(gè)例子:

var  obj1={a:1,b:5,c:3};
var  obj2=obj1;
     obj2.b=2;
     console.log(obj1.b);  //2
     console.log(obj2.b);  //2

可以看到兩個(gè)對(duì)象的值都被修改了

淺拷貝:只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身敷存,相當(dāng)于是新建了一個(gè)對(duì)象,該對(duì)象復(fù)制了原對(duì)象的指針,新舊對(duì)象還是共用一個(gè)內(nèi)存塊瘪贱,任何一個(gè)修改都會(huì)是使得所有對(duì)象的值被修改
應(yīng)用場(chǎng)景:從服務(wù)器fetch到數(shù)據(jù)之后我將其存放在store中,通過(guò)props傳遞給界面辆毡,然后我需要對(duì)這堆數(shù)據(jù)進(jìn)行修改菜秦,那涉及到的修改就一定有保存和取消,所以我們需要將這堆數(shù)據(jù)拷貝到其它地方

深拷貝:
簡(jiǎn)單來(lái)說(shuō)就是一個(gè)對(duì)象B復(fù)制另一個(gè)對(duì)象A舶掖,當(dāng)改變B對(duì)象的值是A對(duì)象的值不會(huì)改變球昨。
舉個(gè)例子:

var a=2;
var b=a;
    b=3;
    console.log(a);//2
    console.log(b);//3

以上例子說(shuō)明兩個(gè)變量使用的是獨(dú)立的數(shù)據(jù)。對(duì)于基本數(shù)據(jù)類(lèi)型來(lái)說(shuō)不存在深拷貝眨攘、淺拷貝主慰。直接賦值就是深拷貝。

深拷貝:深拷貝不會(huì)拷貝引用類(lèi)型的引用期犬,拷貝的是引用類(lèi)型的值河哑,形成一個(gè)新的引用類(lèi)型。新建一個(gè)一模一樣的對(duì)象龟虎,該對(duì)象與原對(duì)象不共享內(nèi)存璃谨,修改新對(duì)象也不會(huì)影響原對(duì)象
應(yīng)用場(chǎng)景:當(dāng)你想使用某個(gè)對(duì)象的值,在修改時(shí)不想修改原對(duì)象鲤妥,那么可以用深拷貝弄一個(gè)新的內(nèi)存對(duì)象佳吞。像es6的新增方法都是深拷貝,所以推薦使用es6語(yǔ)法

如何實(shí)現(xiàn)深拷貝:

①JSON.Stringify(JSON.pare()) 不支持多層引用嵌套棉安,不支持函數(shù)Map底扳、Sep等類(lèi)型的數(shù)據(jù)

var  obj1={a:1,b:5,c:3};
var  obj2=JSON.Stringify(JSON.parse(obj1));
     obj2.b=2;
     console.log(obj1.b);  //5
     console.log(obj2.b);  //2

②jQuery.extend()方法,第一個(gè)參數(shù)要傳true
③Object.asssign(target,sourse)

var  obj1={a:1,b:5,c:3};
var  obj2=Object.assign({},obj1)
     obj2.b=2;
     console.log(obj1.b);  //5
     console.log(obj2.b);  //2

④深拷貝函數(shù),遞歸

// target 要拷貝的對(duì)象
            function deepClone(target){
                //定義一個(gè)拷貝對(duì)象
                let result;
                // 判斷拷貝目標(biāo)是不是Object對(duì)象
                if(typeof target==='object'){
                    // 判斷是否是數(shù)組類(lèi)型
                    if(Array.isArray(target)){
                        // 定義為數(shù)組
                        result=[];
                        for(let i in target){
                            result.push(deepClone(target[i]));
                        }
                    }else if(target===null){
                        // 直接賦值
                        result=null;
                    }else if(target.constructor===RegExp){
                        // 直接賦值
                        result=target;
                        // 不是特殊的對(duì)象
                    }else{
                        result={};
                        for(let i in target){
                            // 遞歸
                            result[i]=deepClone(target[i]);
                        }
                    }
                    // 基本數(shù)據(jù)類(lèi)型  直接賦值
                }else{
                    result=target;
                }
                return result;
            }
var obj1={
a:{z:1,c:null},
b:[1,2,3,5],
c:function(){console.log(this.a)}
}
var obj2=deepClone(obj1);
console.log(obj2);
obj2.b[0]=2;
obj2.a[0]=2;
console.log(obj1.a)
console.log(obj2.a)
console.log(obj1.b)
console.log(obj2.b)
console.log(obj2.c())
1.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贡耽,一起剝皮案震驚了整個(gè)濱河市衷模,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒲赂,老刑警劉巖阱冶,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異滥嘴,居然都是意外死亡木蹬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)若皱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镊叁,“玉大人尘颓,你說(shuō)我怎么就攤上這事』奁” “怎么了疤苹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蛔添。 經(jīng)常有香客問(wèn)我痰催,道長(zhǎng),這世上最難降的妖魔是什么迎瞧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任夸溶,我火速辦了婚禮,結(jié)果婚禮上凶硅,老公的妹妹穿的比我還像新娘缝裁。我一直安慰自己,他們只是感情好足绅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布捷绑。 她就那樣靜靜地躺著,像睡著了一般氢妈。 火紅的嫁衣襯著肌膚如雪粹污。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天首量,我揣著相機(jī)與錄音壮吩,去河邊找鬼。 笑死加缘,一個(gè)胖子當(dāng)著我的面吹牛鸭叙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拣宏,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沈贝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了勋乾?” 一聲冷哼從身側(cè)響起宋下,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辑莫,沒(méi)想到半個(gè)月后杨凑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摆昧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜒程。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绅你。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伺帘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忌锯,到底是詐尸還是另有隱情伪嫁,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布偶垮,位于F島的核電站张咳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏似舵。R本人自食惡果不足惜脚猾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砚哗。 院中可真熱鬧龙助,春花似錦、人聲如沸蛛芥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仅淑。三九已至称勋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涯竟,已是汗流浹背赡鲜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昆禽,地道東北人蝗蛙。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像醉鳖,于是被迫代替她去往敵國(guó)和親捡硅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容