拷貝的定義
- 拷貝:復(fù)制、Ctrl+C、搞一份一樣的東西出來封恰。
- 深拷貝:開辟一個(gè)新的空間,將原來的東西復(fù)制一份完完整整的進(jìn)去褐啡,就和備份類似诺舔,所以深拷貝修改一個(gè)對(duì)象不會(huì)影響另一個(gè)對(duì)象(深拷貝是在 堆 中申請(qǐng)新的空間來存儲(chǔ)拷貝的數(shù)據(jù),這樣就可以避免指針懸掛备畦;指針懸掛:指針指向非法的內(nèi)存地址低飒,也叫野指針,也就是正常使用的指針)
- 淺拷貝:淺拷貝分為兩種:
1.如果屬性為基本類型的拷貝萍恕,那么復(fù)制出來的就是基本類型的值逸嘀;
2.如果屬性為引用類型的拷貝,那么復(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等,只有值存放在棧中市袖,其他基本存放在堆中啡直。
簡單說一下什么是堆什么是棧
堆和棧都是操作系統(tǒng)自帶的一個(gè)內(nèi)存空間;
棧是有系統(tǒng)自動(dòng)分配的內(nèi)存空間苍碟,椌泼伲空間里面存儲(chǔ)的是可以直接訪問的;
堆是后期程序員可以開辟擴(kuò)大的微峰,一般由程序員主動(dòng)分配才釋放舷丹;
棧優(yōu)點(diǎn):速度快;堆優(yōu)點(diǎn):內(nèi)存大蜓肆;
你在什么時(shí)候使用過深拷貝/淺拷貝呢掂榔?
深拷貝:一般ES6里的新增語法都是深拷貝,深拷貝會(huì)找到復(fù)雜數(shù)據(jù)類型里面的元素的值來復(fù)制症杏,比如說:遞歸装获、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)