JS中堆和棧的深入理解

首先了解下傳統(tǒng)意義上的堆和棧

image.png

什么是堆?

可以把堆認(rèn)為是一個(gè)很大的內(nèi)存存儲(chǔ)空間,你可以在里面存儲(chǔ)任何類型數(shù)據(jù)。但是這個(gè)空間是私有的,操作系統(tǒng)不會(huì)管在里面存儲(chǔ)了什么,也不會(huì)主動(dòng)的去清理里面的內(nèi)容,因此在C語言中需要程序員手動(dòng)進(jìn)行內(nèi)存管理,以免出現(xiàn)內(nèi)存泄漏,進(jìn)而影響性能。

什么是棧?

棧是內(nèi)存中一塊用于存儲(chǔ)局部變量和函數(shù)參數(shù)的線性結(jié)構(gòu),遵循著先進(jìn)后出的原則。數(shù)據(jù)只能順序的入棧,順序的出棧。當(dāng)然,棧只是內(nèi)存中一片連續(xù)區(qū)域一種形式化的描述,數(shù)據(jù)入棧和出棧的操作僅僅是棧指針在內(nèi)存地址上的上下移動(dòng)而已。

JS中數(shù)據(jù)在堆棧中的存儲(chǔ)

原始類型(String,Number,Boolean,Null,Undefined,BigInt)

數(shù)據(jù)本身是存在棧內(nèi),例:

function () {
  let foo = 1;
  let bar = 2;
}

上面例子的棧的圖示如下:

image.png

function生命周期結(jié)束后棧會(huì)從上到下出棧釋放內(nèi)存。
\color{#ff0000}{注:JS的棧并非傳統(tǒng)意義上的棧,只是用堆實(shí)現(xiàn)了棧的機(jī)制}

對(duì)象類型(Function,Array,Object)

在棧中存的只是一個(gè)堆內(nèi)地址的引用,例:

function () {
  let foo = 1;
  let bar = 2;
  let obj = {
    a: 1,
    b: 2,
  }
}

上面例子的堆棧的圖示如下:


image.png

function生命周期結(jié)束后棧會(huì)從上到下出棧釋放內(nèi)存,堆中的內(nèi)存也會(huì)被自動(dòng)回收,這里堆的內(nèi)存并不需要我們?nèi)ナ謩?dòng)回收。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容