? ? ? ? 前幾天面試,筆試時(shí)有道題是要自己寫一個(gè)例子實(shí)現(xiàn)深拷貝,頓時(shí)懵逼了。深拷貝也不是沒接觸過,只是以前實(shí)際項(xiàng)目中沒有運(yùn)用,后來就只記得有這么個(gè)概念,更沒有深究其原理?,F(xiàn)在我來說說我對(duì)js深拷貝最新的理解。
? ? ? ? js數(shù)據(jù)類型存儲(chǔ)方式
? ? ? ? 基本類型:undefined,null,Boolean,Number和String,這些類型分別在內(nèi)存中占有固定的大小空間,它們的值保存在??臻g,我們通過按值來訪問的。
? ? ? ? 引用類型:對(duì)象、數(shù)組、函數(shù)等。對(duì)于引用類型的值,則必須在堆內(nèi)存中為這個(gè)值分配空間。由于引用類型值的大小不固定(對(duì)象有很多屬性和方法,而且還可以動(dòng)態(tài)的添加屬性和方法),因此不能把他們保存到棧內(nèi)存中。但內(nèi)存地址大小是固定的,因此可以將內(nèi)存地址保存在棧內(nèi)存中。
? ? ? ? 簡(jiǎn)而言之:棧內(nèi)存中存放的是基本數(shù)據(jù)類型值,堆內(nèi)存中存放的是引用類型值,引用類型值在內(nèi)存中的地址存放在棧中,也就是我們常說的對(duì)象對(duì)象引用(指針)。
? ? ? ??淺拷貝
? ? ? ? 淺拷貝就是將值簡(jiǎn)單的賦給其他變量,用來備份數(shù)據(jù),但很多時(shí)候,會(huì)得到不是我們想要得到的結(jié)果,讓我們來看下面這段代碼:
? ? ? ? 從上面例子可以看出:在變量復(fù)制方面,基本類型和引用類型有所不同,基本類型復(fù)制的是值本身,而引用類型復(fù)制的是內(nèi)存地址,如果有一個(gè)對(duì)象值變化了,另一個(gè)也會(huì)跟著變化。
? ? ? ? 深拷貝
? ? ? ? 所謂”深拷貝”,就是能夠?qū)崿F(xiàn)真正意義上的數(shù)組和對(duì)象的拷貝。它的實(shí)現(xiàn)并不難,只要遞歸調(diào)用”淺拷貝”就行了。
? ? ? ? 這樣就實(shí)現(xiàn)數(shù)組和對(duì)象的深拷貝。
? ? ? ? 很簡(jiǎn)單吧,趕快試一試哦!