堆是堆內(nèi)存的簡稱,棧是棧內(nèi)存的簡稱眨补。
堆是動態(tài)分配內(nèi)存,內(nèi)存大小不一倒脓,也不會自動釋放撑螺。棧是自動分配相對固定大小的內(nèi)存空間,并由系統(tǒng)自動釋放.
JS的數(shù)據(jù)類型
- 基本數(shù)據(jù)類型
Undefined崎弃、Null甘晤、Boolean、String饲做、Number线婚、Symbol都是直接按值直接存在棧中,每種類型的數(shù)據(jù)占用的內(nèi)存空間大小都是固定的盆均,并且由系統(tǒng)自動分配自動釋放 - 引用數(shù)據(jù)類型
Object塞弊,Array,F(xiàn)unction這樣的數(shù)據(jù)存在堆內(nèi)存中缀踪,但是數(shù)據(jù)指針是存放在棧內(nèi)存中的,當(dāng)我們訪問引用數(shù)據(jù)時虹脯,先從棧內(nèi)存中獲取指針驴娃,通過指針在堆內(nèi)存中找到數(shù)據(jù)
以代碼為例:
let arr_origin = [1,2,3,4,5];
let arr_copy = arr_origin;
let arr2 = arr_origin[2];
如果執(zhí)行下面代碼:
arr_copy[1] = 'change1';
arr2 = ‘change2’
我們發(fā)現(xiàn)arr_origin中的下標(biāo)是1的值變成可change1循集,但是下標(biāo)是2的值并未變化唇敞。原因是:arr_copy是arr_origin棧指針的引用,并未開辟新的內(nèi)存空間咒彤,但是arr2是在棧內(nèi)存中獨(dú)立存在疆柔,所以會產(chǎn)生上述結(jié)果。熟悉此原理镶柱,則數(shù)據(jù)的深淺拷貝就不難理解了旷档!