【ionic開發(fā)】TypeScript的深拷貝與淺拷貝

duwenquan-方形LOGO.png

TypeScript

????TypeScript是一種由微軟開發(fā)的自由和開源的編程語言。它是JavaScript的一個(gè)超集,而且本質(zhì)上向這個(gè)語言添加了可選的靜態(tài)類型和基于類的面向?qū)ο缶幊?/a>藏澳。
????TypeScript擴(kuò)展了
JavaScript的語法娇豫,所以任何現(xiàn)有的JavaScript程序可以不加改變的在TypeScript下工作。TypeScript是為大型應(yīng)用之開發(fā)而設(shè)計(jì)脂倦,而編譯時(shí)它產(chǎn)生 JavaScript 以確保兼容性番宁。
????TypeScript 支持為已存在的 JavaScript 庫添加類型信息的頭文件,擴(kuò)展了它對于流行的庫如jQuery赖阻,MongoDB蝶押,Node.js和 D3.js 的好處。

TS中的淺拷貝與深拷貝

????所謂深拷貝與淺拷貝火欧,是圍繞引用類型變量的拷貝進(jìn)行的討論
????在TypeScript中棋电,變量分為基本類型和引用類型兩種。其本質(zhì)區(qū)別是不可變性苇侵,基本類型是不可變的离陶,而引用類型是可變的。

????所謂基本類型的不可變性衅檀,我們可以舉個(gè)例子

let a = 1;
let b = 1;
a++;
console.log("a的值是:"+a,"b的值是:"+b);
//打印結(jié)果如下:
/*
a的值是2招刨,b的值是1
*/

聲明一個(gè)變量a,并為其賦值1哀军,這時(shí)內(nèi)存中開辟出一片區(qū)域用來儲(chǔ)存1沉眶。此時(shí)聲明了一個(gè)變量b打却,也為b賦值1。當(dāng)執(zhí)行a++時(shí)谎倔,基本類型的不可變性就體現(xiàn)出來柳击,a++的值應(yīng)該為2,但是這個(gè)值并不會(huì)將原來儲(chǔ)存1的那片內(nèi)存覆蓋掉片习,而是再開辟一片內(nèi)存來存儲(chǔ)2捌肴。所以對于這個(gè)1來講,他是永遠(yuǎn)不可變的藕咏。

而對于引用變量則不同状知,因?yàn)槠浯鎯?chǔ)的是只想某個(gè)內(nèi)存區(qū)域的地址,所以其修改時(shí)直接操作在內(nèi)存上的孽查,這就導(dǎo)致了深拷貝和淺拷貝問題的出現(xiàn)饥悴。

  • 淺拷貝
let shallowA = {
    x: 1,
    y: -1
}
let shallowB = shallowA;
shallowA.x++;

console.log("shallowA.x==="+shallowA.x,"shallowB.x==="+shallowB.x,)
//打印結(jié)果如下:
shallowA.x === 2 
shallowB.x === 2 

????這就是最簡單的淺拷貝,其效果十分明顯盲再,對拷貝源的操作西设,會(huì)直接體現(xiàn)在拷貝目標(biāo)上,因?yàn)檫@個(gè)賦值行為的本質(zhì)是內(nèi)存地址的賦值答朋,所以他們指向了同一片內(nèi)存區(qū)域贷揽。

????淺拷貝十分容易,也十分常見梦碗,但卻無法滿足需求擒滑,假如我們需要獲得與拷貝源完全相同,卻又不會(huì)互相影響的對象叉弦,應(yīng)該怎么辦呢丐一。

  • Object.assign()
    ????TypeScript為我們提供了一種十分好用的方法,Object.assign(target, ...source)方法assign方法接受多個(gè)參數(shù)淹冰,第一個(gè)參數(shù)target為拷貝目標(biāo)库车,剩余參數(shù)...source是拷貝源。此方法可以將...source中的屬性復(fù)制到target中樱拴,同名屬性會(huì)進(jìn)行覆蓋棍潘,并且在復(fù)制過程中實(shí)現(xiàn)了'偽'深拷貝
let shallowA = {
    a: 1,
    b: 2,
    c: {
        d: 1,
    }
}
let shallowB = {};
Object.assign(shallowB, shallowA);
shallowA.a++;

console.log("shallowA.a==="+shallowA.a,"shallowB.a==="+shallowB.a,);
//打印結(jié)果如下:

shallowA.a === 2 
shallowB.a === 1 

表面上看再沧,好像已經(jīng)實(shí)現(xiàn)了深拷貝的效果,對shallowA.a進(jìn)行的操作并沒有體現(xiàn)在shallowA.a中,但是呢,關(guān)鍵的時(shí)候來了棺蛛,這也是我今天為什么要寫這個(gè)博客的主要問題所在挟阻。

shallowA.c.d++;

console.log("shallowA.c.d==="+shallowA.c.d,"shallowB.c.d==="+shallowB.c.d);

//打印結(jié)果如下:
shallowA.c.d === 2 
shallowB.c.d === 2 

從上面的打印結(jié)果看出伐债,Object.assign()的拷貝類型十分明顯了,這是一種可以對非嵌套對象進(jìn)行深拷貝的方法,如果對象中出現(xiàn)嵌套情況,那么其對被嵌套對象的行為就成了普通的淺拷貝.

在今天的開發(fā)中我也遇到了此問題趣兄。從后臺(tái)返回的數(shù)據(jù)是一個(gè)數(shù)組A,數(shù)組A里面又包含了B對象,B對象中又包含數(shù)組C履怯,數(shù)組C里面又含有對象D回还。
而我又將數(shù)組A拷貝三份。放進(jìn)一個(gè)大數(shù)組叹洲,形如【A1,A2,A3】;其中A1柠硕,A2,A3,都是A數(shù)組拷貝過來运提。當(dāng)我操作A1數(shù)組里面的A.B.C.D的時(shí)候蝗柔,發(fā)現(xiàn),A2,與A3的D對象也跟著改變民泵。
那么癣丧,應(yīng)該如何拷貝才能達(dá)到操作A1中的D對象,而A2與A3的D對象不變呢洪灯,也就是如何實(shí)現(xiàn)完完全全的深拷貝呢坎缭?

stringify()和parse()

JSON對象中包含兩個(gè)方法, stringify()和parse(),前者可以將對象JSON化,而后者可以將JSON格式轉(zhuǎn)換為對象.這是一種可以實(shí)現(xiàn)深拷貝的方法.但這種方法的缺陷是會(huì)破壞原型鏈,并且無法拷貝屬性值為function的屬性所以如果只是想單純復(fù)制一個(gè)嵌套對象,可以使用此方法竟痰。

let shallowA = {
    a: 1,
    b: {
        c: 1
    }
}
let shallowB = JSON.parse(JSON.stringify(shallowA));
shallowA.b.c++;
console.log("shallowA.b.c==="+shallowA.b.c"shallowB.b.c==="+shallowB.b.c);

//打印結(jié)果如下:
shallowA.b.c===2签钩;
shallowB.b.c===1;

由此可見坏快,我們已經(jīng)實(shí)現(xiàn)了對象的完全深拷貝铅檩。

我的問題也就迎刃而解;接下來莽鸿,就可以開心的開發(fā)接下來的功能了昧旨。。祥得。兔沃。不解決此問題真的木辦法往下繼續(xù)了。


image.png

越努力越幸運(yùn)级及,愿你我一起共同努力乒疏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饮焦,隨后出現(xiàn)的幾起案子怕吴,更是在濱河造成了極大的恐慌,老刑警劉巖县踢,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件转绷,死亡現(xiàn)場離奇詭異,居然都是意外死亡硼啤,警方通過查閱死者的電腦和手機(jī)议经,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爸业,你說我怎么就攤上這事其骄。” “怎么了扯旷?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵拯爽,是天一觀的道長。 經(jīng)常有香客問我钧忽,道長毯炮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任耸黑,我火速辦了婚禮桃煎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘大刊。我一直安慰自己为迈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布缺菌。 她就那樣靜靜地躺著葫辐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伴郁。 梳的紋絲不亂的頭發(fā)上耿战,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音焊傅,去河邊找鬼剂陡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狐胎,可吹牛的內(nèi)容都是我干的鸭栖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼握巢,長吁一口氣:“原來是場噩夢啊……” “哼晕鹊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镜粤,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤捏题,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肉渴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體公荧,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年同规,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了循狰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窟社。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绪钥,靈堂內(nèi)的尸體忽然破棺而出灿里,到底是詐尸還是另有隱情,我是刑警寧澤程腹,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布匣吊,位于F島的核電站,受9級特大地震影響寸潦,放射性物質(zhì)發(fā)生泄漏色鸳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一见转、第九天 我趴在偏房一處隱蔽的房頂上張望命雀。 院中可真熱鬧,春花似錦斩箫、人聲如沸吏砂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狐血。三九已至,卻和暖如春寨典,著一層夾襖步出監(jiān)牢的瞬間氛雪,已是汗流浹背房匆。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工耸成, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浴鸿。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓井氢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岳链。 傳聞我的和親對象是個(gè)殘疾皇子花竞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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

  • 值類型與引用類型 談淺拷貝與深拷貝之前,我們需要先理清一個(gè)概念掸哑,即值類型與引用類型约急。 什么是值類型與引用類型?這要...
    franose閱讀 613評論 1 8
  • 概念 在Objective-C中并不是所有的對象都支持Copy苗分,MutableCopy厌蔽,遵守NSCopying協(xié)議...
    LeoAu閱讀 8,741評論 10 28
  • 品效合一或者品效協(xié)同,我們已經(jīng)說了很多年戴卜。之所以那么多年一直說逾条,就是因?yàn)樗鼈冸y以合一。 這個(gè)題目有點(diǎn)標(biāo)題黨投剥。所謂攻...
    諸彥杰閱讀 873評論 0 0
  • 新年的第一天师脂,整天的無意識右腦開發(fā)課程,從人的先天天賦江锨,到目前我們的樣子危彩,通過心理投射理論,雙重?zé)o意識理論等以及色...
    洪雅昕閱讀 439評論 0 0
  • 我有一個(gè)男神泳桦,叫劉同汤徽。 第一次聽到劉同這個(gè)名字,是在7年前左右的一檔電視節(jié)目上灸撰。 大概因?yàn)槲沂切侣剬I(yè)的學(xué)生谒府,而他...
    簡安Tina閱讀 241評論 1 0