如何實(shí)現(xiàn)數(shù)組深拷貝和淺拷貝噪服?

1.背景介紹

什么是棧內(nèi)存和堆內(nèi)存?

JavaScript中的變量的存放有有原始值與引用值之分胜茧,原始值代表了原始的數(shù)據(jù)類型粘优,如Undefined,Null,Number雹顺, String丹墨,Boolean類型的值;而Object嬉愧,F(xiàn)unction带到,Array等類型的值便是引用值了。

棧內(nèi)存中存放的是存儲(chǔ)對(duì)象的地址英染,而堆內(nèi)存中存放的是存儲(chǔ)對(duì)象的具體內(nèi)容揽惹。對(duì)于原始類型的值而言 ,其地址和具體內(nèi)容都存在與棧內(nèi)存中四康;而基于引用類型的值搪搏,其地址存在棧內(nèi)存,其具體內(nèi)容存在堆內(nèi)存中闪金。堆內(nèi)存 與棧內(nèi)存是有區(qū)別的疯溺,棧內(nèi)存運(yùn)行效率比堆內(nèi)存高,空間相對(duì)堆內(nèi)存來(lái)說(shuō)較小哎垦,反之則是堆內(nèi)存的特點(diǎn)囱嫩。所以將構(gòu)造簡(jiǎn) 單的原始類型值放在棧內(nèi)存中,將構(gòu)造復(fù)雜的引用類型值放在堆中而不影響棧的效率漏设。

2.知識(shí)剖析

什么是深拷貝和淺拷貝墨闲?

淺拷貝:復(fù)制一份引用,所有引用對(duì)象都指向一份數(shù)據(jù)郑口,并且都可以修改這份數(shù)據(jù)鸳碧。

深拷貝(復(fù)雜):復(fù)制變量值,對(duì)于非基本類型的變量犬性,則遞歸至基本類型變量后瞻离,再?gòu)?fù)制∑柜桑可以使用slice和concat方法套利。

SLICE和CONCAT使用方法

slice:

語(yǔ)法:arrayObject.slice(start,end)

該方法并不會(huì)修改數(shù)組,而是返回一個(gè)子數(shù)組鹤耍。

start:必需肉迫。規(guī)定從何處開(kāi)始選取。如果是負(fù)數(shù)惰蜜,那么它規(guī)定從數(shù)組尾部開(kāi)始算起的位置昂拂。也就是說(shuō)受神,-1 指最后一個(gè)元素抛猖,-2 指倒數(shù)第二個(gè)元素,以此類推。

end:可選财著。規(guī)定從何處結(jié)束選取联四。該參數(shù)是數(shù)組片斷結(jié)束處的數(shù)組下標(biāo)。如果沒(méi)有指定該參數(shù)撑教,那么切分的數(shù)組包含從 start 到數(shù)組結(jié)束的所有元素朝墩。如果這個(gè)參數(shù)是負(fù)數(shù),那么它規(guī)定的是從數(shù)組尾部開(kāi)始算起的元素伟姐。

concat:

語(yǔ)法:arrayObject.concat(arrayX,arrayX,......,arrayX)

返回一個(gè)新的數(shù)組收苏。該數(shù)組是通過(guò)把所有 arrayX 參數(shù)添加到 arrayObject 中生成的。如果要進(jìn)行 concat() 操作的參 數(shù)是數(shù)組愤兵,那么添加的是數(shù)組中的元素鹿霸,而不是數(shù)組。

arrayX:必需秆乳。該參數(shù)可以是具體的值懦鼠,也可以是數(shù)組對(duì)象∫傺撸可以是任意多個(gè)肛冶。

3.常見(jiàn)問(wèn)題

深拷貝和淺拷貝的運(yùn)用環(huán)境。

4.解決方案

這個(gè)要看大家具體的應(yīng)用扯键,注意到數(shù)組帶來(lái)的影響睦袖。

5.編碼實(shí)戰(zhàn)

淺拷貝的實(shí)現(xiàn),例如:

var arr = ["One","Two","Three"];

var arrto = arr; arrto[1] = "test”;

document.writeln("數(shù)組的原始值:" + arr + "
");//Export:數(shù)組的原始值:One,test,Three

document.writeln("數(shù)組的新值:" + arrto + "
");//Export:數(shù)組的新值:One,test,Three

深拷貝之slice:

var num = ["One","Two","Three"];

var newNum = num.slice(0);

newNum[1] = "haha";

document.writeln("數(shù)組的原始值:" + num + "
");//Export:數(shù)組的原始值:One,Two,Three

document.writeln("數(shù)組的新值:" + newNum + "
");//Export:數(shù)組的新值:One,haha,Three

深拷貝之concat

var arr = new Array(3)

arr[0] = "George"

arr[1] = "John"

arr[2] = "Thomas"

var arr2 = new Array(3)

arr2[0] = "James"

arr2[1] = "Adrew"

arr2[2] = "Martin"

document.write(arr.concat(arr2))//輸出:George,John,Thomas,James,Adrew,Martin;

6.擴(kuò)展思考

對(duì)象的深拷貝

對(duì)象自己寫(xiě)個(gè)迭代函數(shù)就好了荣刑,只需copy到最底層的比如如下代碼扣泊。

function deepCopy(obj,c) {

var c =c || {};

for(var i in obj) {

// 判斷屬性是否為對(duì)象,是的話就進(jìn)一步展開(kāi)

if (typeof(obj[i]) === 'object') {

// 遞歸拷貝

if (obj[i].constructor == Array){

c[i] = [];

deepCopy(obj[i],c[i]);

}

else {

c[i] = {};

deepCopy(obj[i],c[i]);

}

}

else {

c[i] = obj[i];

}

}

return c

};

7.參考文獻(xiàn)

參考一:JavaScript數(shù)組深拷貝和淺拷貝的兩種方法

參考二:原生js對(duì)象的淺拷貝和深拷貝的總結(jié)

8.更多討論

有被淺拷貝坑過(guò)的經(jīng)歷嗎嘶摊?

鳴謝

感謝大家觀看

BY : 彭勇 | 李維文

ppt鏈接:https://ptteng.github.io/PPT/PPT/js-04-arr%20clone.html#/

視頻鏈接:


什么是深拷貝和淺拷貝_騰訊視頻

修真院鏈接:http://www.jnshu.com/login/1/92633351

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邑跪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剑辫,更是在濱河造成了極大的恐慌摘昌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虱颗,死亡現(xiàn)場(chǎng)離奇詭異沥匈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)忘渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)高帖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人畦粮,你說(shuō)我怎么就攤上這事散址」哉螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵预麸,是天一觀的道長(zhǎng)瞪浸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吏祸,這世上最難降的妖魔是什么对蒲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮贡翘,結(jié)果婚禮上蹈矮,老公的妹妹穿的比我還像新娘。我一直安慰自己鸣驱,他們只是感情好含滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著丐巫,像睡著了一般谈况。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上递胧,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天碑韵,我揣著相機(jī)與錄音,去河邊找鬼缎脾。 笑死祝闻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遗菠。 我是一名探鬼主播联喘,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辙纬!你這毒婦竟也來(lái)了豁遭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贺拣,失蹤者是張志新(化名)和其女友劉穎蓖谢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體譬涡,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闪幽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涡匀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盯腌。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陨瘩,靈堂內(nèi)的尸體忽然破棺而出腕够,到底是詐尸還是另有隱情级乍,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布燕少,位于F島的核電站卡者,受9級(jí)特大地震影響蒿囤,放射性物質(zhì)發(fā)生泄漏客们。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一材诽、第九天 我趴在偏房一處隱蔽的房頂上張望底挫。 院中可真熱鬧,春花似錦脸侥、人聲如沸建邓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)官边。三九已至,卻和暖如春外遇,著一層夾襖步出監(jiān)牢的瞬間注簿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工跳仿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诡渴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓菲语,卻偏偏與公主長(zhǎng)得像妄辩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子山上,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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