Stack 與 Heap 差別(未整理)

JASON HO
Jul 7, 2022

--

最近在準備面試,整理一些可能被問到的問題,剛好看到這樣的題目,先做一些內化的紀錄,不然怕幾個月後可能會忘光光XD,之後再來好好補充與修改內容,反正是自己的筆記,如果有錯誤的地方,那就等哪時釐清之後,再來修改了。

Stack memory

這裡常會有人誤會是資料結構的stack,但實際是值的記憶體空間,且只儲存基本型態的值(undefined、null、boolean、string、number、symbol、bigint),特色是資料進出是有順序的,後進先出,也難怪會被資料結構的堆疊搞混了!
舉例:
let a = 1
let b = a
a= 2
console.log(a)/2
console.log(b)/1
這是因為宣告變數都是基本型態的值,所以是利用stack memory的方式分別儲存a與b變數的值,b在開始就是複製a的值,所以b的value還是1,與a後來的變動沒有影響,也稱為copy by value。

Heap memory

是儲存宣告的變數為object時(function、Array),因為物件需要一個更複雜的儲存空間,所以記憶體的數據區會產生一個空間叫heap,來儲存物件型的資料,那這個記憶體的空間位址則儲存在stack,所宣告的變數會指向記憶體的儲存位址。
舉例:
let a = {name : “ Tim ” }
let b = a
a.name = “Jason”
console.log(a)/{name : “ Jason” }
console.log(b)/{name : “ Jason” }
這是因為所宣告的變數為物件,是儲存在記憶體的參照位址,a所參照的物件是{name : “ Tim ” },b=a 只是參照相同位址,所以當a的參照位址內容改變了,b也會跟著改變,這就是我們說的copy by reference。

Garbage collector

這裡我想補充一下,JS 在建立事物時(物件、字串),就會自動分配記憶體空間給值,也會釋放用不到的值得空間,這個是一種回收機制,又稱垃圾回收器(garbage collector) 的系統,跟C與言不一樣,C語言有提供記憶體管理的函式,需要自己設定。

--

--