淺析---淺拷貝與深拷貝

? ? ? ? ? 拷貝(也稱(chēng)克隆),指的是我們對(duì)從服務(wù)器請(qǐng)求回來(lái)的數(shù)據(jù),進(jìn)行"復(fù)制",我們可以對(duì)副本進(jìn)行修改等操作,不能影響到原來(lái)的數(shù)據(jù),如果修改的數(shù)據(jù)不理想,可以在不向服務(wù)器從新發(fā)送請(qǐng)求的情況下,返回到原來(lái)的數(shù)據(jù),

? ? ? ? ? 淺拷貝和深拷貝的區(qū)別是:淺拷貝只會(huì)拷貝對(duì)象最外部的一層,至于更深層次的對(duì)象,則依然是通過(guò)引用指向同一塊堆內(nèi)存.(意思是,拷貝之后的對(duì)象發(fā)生了變化,原對(duì)象也會(huì)發(fā)生變化);而深拷貝在一定程度上,解決了這個(gè)問(wèn)題


淺拷貝

????????// 淺拷貝函數(shù)

????????????function shallowClone(oldobj) {

????????????? ????const obj = { };? ?//const 常量

? ????????????????for ( let? ?i? ?in? obj) {

? ? ????????????????????obj [i] = oldobj [i];

????????????????? }

????????????????? return obj;

????????????}

????????// 被克隆對(duì)象

????????const oldObj = {

? ????????????????a: 1,

? ????????????????b: [ 'e', 'f', 'g' ],

? ????????????????c: { h: { i: 2 } }

? ? ? ? ?};

????????const newObj = shallowClone(oldObj);

????????console.log(newObj.c.h, oldObj.c.h);? ? ?// { i: 2 } { i: 2 }??

????????console.log(oldObj.c.h === newObj.c.h);? ? // true

????????newObj.c.h.i = 'change';

? ? ? ? console.log(newObj.c.h, oldObj.c.h);? ?// { i: 'change' } { i: 'change' }

????????// 改變newobj的值,oldobj的值也會(huì)變(說(shuō)明他們指向了同一段堆內(nèi)存),這種效果并不是我們想要的,所以,出現(xiàn)了深拷貝

深拷貝

? ? 第一種方法--------深拷貝函數(shù)

```

//使用遞歸的方式實(shí)現(xiàn)數(shù)組犁享、對(duì)象的深拷貝

function deepClone1(obj) {

? //判斷拷貝的要進(jìn)行深拷貝的是數(shù)組還是對(duì)象文兢,是數(shù)組的話(huà)進(jìn)行數(shù)組拷貝娱两,對(duì)象的話(huà)進(jìn)行對(duì)象拷貝

? var objClone = Array.isArray(obj) ? [] : {};

? //進(jìn)行深拷貝的不能為空熔掺,并且是對(duì)象或者是

? if (obj && typeof obj === "object") {

? ? for (key in obj) {

? ? ? if (obj.hasOwnProperty(key)) {

? ? ? ? if (obj[key] && typeof obj[key] === "object") {

? ? ? ? ? objClone[key] = deepClone1(obj[key]);

? ? ? ? } else {

? ? ? ? ? objClone[key] = obj[key];

? ? ? ? }

? ? ? }

? ? }

? }

? return objClone;

原文鏈接:https://blog.csdn.net/chentony123/article/details/81428803

```

? ??????????????var oldobj={

????????????????????name:"apple",

????????????????????price:28,

????????????????????des:{a:{i:3}}

????????????????}

????????????????????var? newobj = deepCopy(oldobj);

????????????????????console.log(newobj,oldobj);? // { i : 3 },{ i : 3 }

????????????????????newobj.des.a.i=7;

? ? ? ? ? ? ? ? ? ? console.log(newobj,oldobj);// { i : 7 },{ i : 3 }? ? ?//新對(duì)象的 i 值變了,原對(duì)象的 i 值并沒(méi)有變

第二種方法------json.parse(),和json.stringify()方法

?????????????var oldobj={

????????????????????name:"apple",

????????????????????price:28,

????????????????????des:{a:{i:3}}

????????????????}

? ? ? ? ? ? ? ? var? newobj = JSON.parse(JSON.stringify(oldobj));

? ? ? ? ? ? ? ? console.log(newobj,oldobj);? // { i : 3 },{ i : 3 }

? ? ? ? ? ? ? ? ?newobj.des.a.i=7;?

? ? ? ? ? ? ? ? ?console.log(newobj,oldobj);// { i : 7 },{ i : 3 }? ? ?//得到的效果是和深拷貝函數(shù)的效果一樣

但是,深拷貝的兩種方法,都只能解決普通的深拷貝問(wèn)題,特殊的對(duì)象(函數(shù),正則對(duì)象,構(gòu)造函數(shù),稀疏數(shù)組),這兩種方法還解決不了.

????????????functionPerson(name){

????????????????????this.name=name;

????????????}

? ? ? ? ? var lili= new Person("lili")

????????????function say(){

????????????????????console.log("hi")

????????????}

????????????var oldobj= {

????????????????????a:lili,

????????????????????b:say,

????????????????????c:new Array(1),

????????????????????d:RegExp("abc","i")

????????????}

????????var newobj= deepcopy(oldobj);

????????console.log(newobj.a,oldobj.a);????? //object? ?, Person? //構(gòu)造函數(shù)的指向不一樣

? ? ? ? console.log(newobj.b,oldobj.b);? ? ? //function , function? 拷貝函數(shù)打印的效果是對(duì)的,json.parse方法不行,打印的新對(duì)象為空

? ? ? ? console.log(newobj.c,oldobj.c);? ? ? // {? }, [ empty ]

????????console.log(newobj.d,oldobj.d);? ? ?// {? },? / abc / i


總結(jié):一般情況下,深拷貝的兩種方法就應(yīng)經(jīng)夠用了,如果遇到處理特殊對(duì)象的問(wèn)題,再具體問(wèn)題具體分析吧.


```

// 深克隆

// 循環(huán)遍歷每一個(gè)元素钙勃,判斷是原始值還是引用值

// 如果是原始值祖秒,就直接賦值落包,如果是引用值部蛇,就再次判斷是object,還是array

// 新建 [] || {} 再賦值

// 循環(huán)遞歸

function deepclone (orign,target){

var target = target || {}

var toStr = Object.prototype.toString

for(var prop in orign){

if(orign.hasOwnProperty(prop)){

if(typeof(orign[prop]) == 'object' && typeof(orign[prop])== null){

if(toStr.call(orign[prop]) === '[Object Array]'){

target[prop] = []

} else {

target[prop] = {}

}

deepclone(orign[prop],target[prop])

}else {

target[prop] = orign[prop]

}

}

}

return target

}

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咐蝇,一起剝皮案震驚了整個(gè)濱河市涯鲁,隨后出現(xiàn)的幾起案子巷查,更是在濱河造成了極大的恐慌,老刑警劉巖抹腿,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岛请,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡警绩,警方通過(guò)查閱死者的電腦和手機(jī)崇败,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肩祥,“玉大人后室,你說(shuō)我怎么就攤上這事』旌荩” “怎么了岸霹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)将饺。 經(jīng)常有香客問(wèn)我贡避,道長(zhǎng),這世上最難降的妖魔是什么予弧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任刮吧,我火速辦了婚禮,結(jié)果婚禮上掖蛤,老公的妹妹穿的比我還像新娘杀捻。我一直安慰自己,他們只是感情好蚓庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布水醋。 她就那樣靜靜地躺著,像睡著了一般彪置。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝇恶,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天拳魁,我揣著相機(jī)與錄音,去河邊找鬼撮弧。 笑死潘懊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贿衍。 我是一名探鬼主播授舟,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贸辈!你這毒婦竟也來(lái)了释树?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奢啥,沒(méi)想到半個(gè)月后秸仙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桩盲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年寂纪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赌结。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捞蛋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柬姚,到底是詐尸還是另有隱情拟杉,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布伤靠,位于F島的核電站捣域,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宴合。R本人自食惡果不足惜焕梅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卦洽。 院中可真熱鬧贞言,春花似錦、人聲如沸阀蒂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蚤霞。三九已至酗失,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昧绣,已是汗流浹背规肴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夜畴,地道東北人拖刃。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贪绘,于是被迫代替她去往敵國(guó)和親兑牡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)税灌,也就是一...
    悟名先生閱讀 4,149評(píng)論 0 13
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象均函,但只有一個(gè)實(shí)例亿虽,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見(jiàn)的單例模式边酒,...
    Obeing閱讀 2,069評(píng)論 1 10
  • 《ijs》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶(hù)交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 5,147評(píng)論 0 7
  • title: 原生js對(duì)象的淺拷貝和深拷貝的總結(jié) 這里是說(shuō)明. 在此之前我們先復(fù)習(xí)兩個(gè)知識(shí)點(diǎn). 第一個(gè)知識(shí)點(diǎn):對(duì)象...
    KingJeason閱讀 836評(píng)論 1 8
  • 有這么一個(gè)人经柴,于星星而言,看似遙不可及墩朦,卻又觸手可及坯认。 遇見(jiàn)你的時(shí)候所有星星都落到我頭上 第一次知道張杰這個(gè)名字,...
    小巨人啊_閱讀 1,462評(píng)論 3 1