小猿圈JavaScript深拷貝和淺拷貝

你會(huì)不會(huì)在開發(fā)項(xiàng)目的過程中遇到這樣的問題废麻,經(jīng)常會(huì)拿到一個(gè)數(shù)據(jù)后需要拷貝一份副本出來,而且很多前端框架都是拷貝的绑嘹,針對(duì)以上的問題小猿圈講師分享給大家JavaScript深拷貝和淺拷貝浸剩,希望對(duì)于學(xué)習(xí)中的你,有一定的幫助窒舟。

涉及到了JS中對(duì)數(shù)據(jù)的深淺拷貝問題,所謂深淺拷貝诵盼,淺拷貝的意思就是惠豺,你只是復(fù)制了對(duì)象數(shù)據(jù)的引用,并沒有把內(nèi)存里的值另外復(fù)制一份风宁,那么深拷貝就是把值完整地復(fù)制一份新的值洁墙。操作拷貝之后的數(shù)據(jù)不會(huì)影響到原數(shù)據(jù)的值拷貝,就是深拷貝戒财,反正热监,有影響則為淺拷貝。

一固翰、應(yīng)用場景

日常開發(fā)中狼纬,JS拷貝大多會(huì)在數(shù)據(jù)保存,數(shù)據(jù)比對(duì)骂际,數(shù)據(jù)同步時(shí)出現(xiàn),所以冈欢,當(dāng)你在這些場景的時(shí)候歉铝,要記得里面隱藏有一個(gè)數(shù)據(jù)深淺拷貝的問題。

二凑耻、淺拷貝

functionclone(origin){

varresult={};

for(varpropinorigin){

if(origin.hasOwnProperty(prop)){

result[prop]=origin[prop];

}

}

returnresult;

}

varjay={

name:"jayChou",

age:40,

family:{

wife:"Quinlivan"

}

}

varotherJay=clone(jay);

otherJay.age=18;

otherJay.family.wife="otherGirl";

console.log(jay);

//

//{

//name:"jayChou",

//age:40,//沒被改變

//family:{

//wife:"otherGirl"http://同時(shí)被改變太示,說明是同一個(gè)引用

//}

//}

console.log(otherJay);

//

//{

//name:"jayChou",

//age:18,

//family:{

//wife:"otherGirl"http://被改變了

//}

//}

我們發(fā)現(xiàn),首先香浩,淺拷貝不是直接賦值类缤,淺拷貝新建了一個(gè)對(duì)象,然后將源對(duì)象的屬性都一一復(fù)制過來,復(fù)制的是值邻吭,而不是引用餐弱。

我們知道,對(duì)象都是按地址引用進(jìn)行訪問的囱晴,淺拷貝的復(fù)制只復(fù)制了第一層的屬性膏蚓,并沒有遞歸將所有的值復(fù)制過來,所以畸写,操作拷貝數(shù)據(jù)驮瞧,對(duì)原數(shù)據(jù)產(chǎn)生了影響,故而為淺拷貝枯芬。進(jìn)而论笔,那些可以直接返回原數(shù)組的方法就可以簡單實(shí)現(xiàn)數(shù)組和對(duì)象淺拷貝采郎。

//1、數(shù)組淺拷貝-slice

functionshallowCopy1(origin){

returnorigin.slice();

}

//2狂魔、數(shù)組淺拷貝-concat

functionshallowCopy2(origin){

returnorigin.concat();

}

//3蒜埋、數(shù)組淺拷貝-遍歷

functionshallowCopy3(origin){

varresult=[];

for(vari=0;i<origin.length;i++){

result.push(origin[i]);

}

returnresult;

}

//4、對(duì)象淺拷貝-Object.assign

functionshallowCopy4(origin){

returnObject.assign({},origin)

}

//5毅臊、對(duì)象淺拷貝-擴(kuò)展運(yùn)算符

//擴(kuò)展運(yùn)算符(...)用于取出參數(shù)對(duì)象的所有可遍歷屬性理茎,拷貝到當(dāng)前對(duì)象之中

functionshallowCopy5(origin){

return{

...origin

}

}

Object.assign的拷貝,假如源對(duì)象的屬性值是一個(gè)指向?qū)ο蟮囊霉苕遥仓豢截惸莻€(gè)引用值皂林。MDN有相應(yīng)的實(shí)例和解釋。

三蚯撩、深拷貝

深拷貝就完整復(fù)制數(shù)據(jù)的值(而非引用)础倍,目的在于避免拷貝后數(shù)據(jù)對(duì)原數(shù)據(jù)產(chǎn)生影響。

//1.深拷貝-JSON正反序列化

//缺點(diǎn)就是無法拷貝undefined胎挎、function沟启、symbol這類特殊的屬性值。

functiondeepClone1(origin){

returnJSON.parse(JSON.stringify(arr));

}

//2.深拷貝-遞歸;

functiondeepClone2(origin){

constresult=origin.constructor===Array?[]:{};

for(letkeysinorigin){

//不遍歷原型鏈上的屬性

if(origin.hasOwnProperty(keys)){

if(origin[keys]&&typeoforigin[keys]==="object"){

//如果值是對(duì)象犹菇,就遞歸一下,區(qū)分是一般對(duì)象還是數(shù)組對(duì)象

result[keys]=origin[keys].constructor===Array?[]:{};

//如果是引用數(shù)據(jù)類型德迹,會(huì)遞歸調(diào)用

result[keys]=deepClone(origin[keys]);

}else{

//如果不是,就直接賦值

result[keys]=origin[keys];

}

}

}

returnresult;

}

JS的深拷貝的應(yīng)用揭芍,需要根據(jù)你的使用場景進(jìn)行使用胳搞,首先是有無必要深拷貝,其次是數(shù)據(jù)類型称杨,是否直接使用JSON的API其實(shí)就可以肌毅。

經(jīng)過小猿圈老師的介紹相信很多同學(xué)對(duì)于JavaScript深拷貝和淺拷貝有了一定的了解,不過大家不要忘記點(diǎn)贊姑原、收藏悬而、轉(zhuǎn)發(fā)呦,讓更多和你一樣有同樣問題的同學(xué)得到幫助锭汛,小猿圈為大家提供一個(gè)良好的學(xué)習(xí)平臺(tái)笨奠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市店乐,隨后出現(xiàn)的幾起案子艰躺,更是在濱河造成了極大的恐慌,老刑警劉巖眨八,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腺兴,死亡現(xiàn)場離奇詭異,居然都是意外死亡廉侧,警方通過查閱死者的電腦和手機(jī)页响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門篓足,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闰蚕,你說我怎么就攤上這事栈拖。” “怎么了没陡?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵涩哟,是天一觀的道長。 經(jīng)常有香客問我盼玄,道長贴彼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任埃儿,我火速辦了婚禮器仗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘童番。我一直安慰自己精钮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布剃斧。 她就那樣靜靜地躺著轨香,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幼东。 梳的紋絲不亂的頭發(fā)上弹沽,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音筋粗,去河邊找鬼。 笑死炸渡,一個(gè)胖子當(dāng)著我的面吹牛娜亿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚌堵,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼买决,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吼畏?” 一聲冷哼從身側(cè)響起督赤,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泻蚊,沒想到半個(gè)月后躲舌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡性雄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年没卸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羹奉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡约计,死狀恐怖诀拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煤蚌,我是刑警寧澤耕挨,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站尉桩,受9級(jí)特大地震影響筒占,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魄健,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一赋铝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沽瘦,春花似錦革骨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至助隧,卻和暖如春筑凫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背并村。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工巍实, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哩牍。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓棚潦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膝昆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丸边,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • 原文鏈接:http://www.3mooc.com/front/articleinfo/92 我們?cè)陧?xiàng)目開發(fā)過程中...
    三人行慕課閱讀 204評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,111評(píng)論 1 32
  • 在說深拷貝與淺拷貝前,我們先看兩個(gè)簡單的案例: //案例1var num1 = 1, num2 = num1;co...
    lueyoo閱讀 622評(píng)論 0 1
  • 小編已經(jīng)更新了代碼部分荚孵,戳這里 一妹窖、數(shù)據(jù)類型 數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean...
    grain先森閱讀 2,750評(píng)論 2 53
  • 1 當(dāng)年讀大學(xué)的時(shí)候,曾經(jīng)和人一起合租收叶,合租的姑娘嬌生慣養(yǎng)骄呼,據(jù)說在家過了十八年,連垃圾都沒有倒過。 所以從合租的第...
    偶爾_5c4f閱讀 3,557評(píng)論 16 90