拷貝的定義
1.拷貝:復(fù)制、Ctrl+C、搞一份一樣的東西出來(lái)。
2.深拷貝:開辟一個(gè)新的空間,將原來(lái)的東西復(fù)制一份完完整整的進(jìn)去,就和備份類似,所以深拷貝修改一個(gè)對(duì)象不會(huì)影響另一個(gè)對(duì)象(深拷貝是在堆中申請(qǐng)新的空間來(lái)存儲(chǔ)拷貝的數(shù)據(jù),這樣就可以避免指針懸掛;指針懸掛:指針指向非法的內(nèi)存地址,也叫野指針,也就是正常使用的指針)
3.淺拷貝:淺拷貝分為兩種:
如果屬性為基本類型的拷貝,那么復(fù)制出來(lái)的就是基本類型的值;
如果屬性為引用類型的拷貝,那么復(fù)制的就是內(nèi)存地址;所以不管是拷貝還是被拷貝的一方改變了這個(gè)地址,都會(huì)影響到另一方
基本類型和引用類型
JS里面的幾種(數(shù)據(jù))類型分為:基本(數(shù)據(jù))類型和引用(數(shù)據(jù))類型;
基本(數(shù)據(jù))類型:Number、String、Boolean、Null、undefined、Symbol等基本上都存放在棧中。。
引用(數(shù)據(jù))類型:也就是Object type,比如Object、Array、Function、Data等,只有值存放在棧中,其他基本存放在堆中。
簡(jiǎn)單說(shuō)一下什么是堆什么是棧
1.堆和棧都是操作系統(tǒng)自帶的一個(gè)內(nèi)存空間;
2.棧是有系統(tǒng)自動(dòng)分配的內(nèi)存空間,棧空間里面存儲(chǔ)的是可以直接訪問(wèn)的;
3.堆是后期程序員可以開辟擴(kuò)大的,一般由程序員主動(dòng)分配才釋放;
4.棧優(yōu)點(diǎn):速度快;堆優(yōu)點(diǎn):內(nèi)存大;
你在什么時(shí)候使用過(guò)深拷貝/淺拷貝呢?
深拷貝:一般ES6里的新增語(yǔ)法都是深拷貝,深拷貝會(huì)找到復(fù)雜數(shù)據(jù)類型里面的元素的值來(lái)復(fù)制,比如說(shuō):遞歸、JSON(JSON.stringfy+JSON.parse)、lodash、、jQuery.extend()方法第一個(gè)參數(shù)要傳true、structuredClone
淺拷貝:復(fù)制在內(nèi)存中的引用地址,比如:剩余運(yùn)算符、Object.assign()、數(shù)組原型上的方法實(shí)現(xiàn)數(shù)組淺拷貝(Array.prototype.slice、Array.prototype.concat)