js的記憶體機制(簡單介紹)

2021-09-25 12:22:31 字數 2076 閱讀 1287

簡單的資料型別是放在棧中的,例如undefine,null,number,boolean,string,是直接引用的;

複雜的資料型別的放在堆中的,只是在棧中存放了乙個位址,通過位址在堆中尋找資料,例如array,objec等。

注意點1:

let a =

10let b = a

b =20

這個上面的a不會受到影響還是10,b變成了20

let obja =

let objb = obja

objb.a =

30

這個時候,obja中的a變成了30

注意點2:

let str1 =

newstring

('1'

)let str2 =

'2'

同樣是string,str1使用new建立了乙個新的物件,放在了堆中,而str2是之間儲存在棧裡面,str2的這種方式大大提高了程式執行速度

let str1 =

'abc'

let str2 =

'abc'

str1 == str2 //true

str1 === str2 //true

//這裡str1和str2都只想棧裡面的abc

//注:如果棧裡面有當前資料,則引用直接只想棧裡面已有的資料,不會建立新的,比如str2會先檢視一下棧中是否有'abc',發現已經有了,直接指向了'abc'

let str1 =

newstring

('abc'

)let str2 =

newstring

('abc'

)str1 == str2 //false

str1 === str2 //false

//這裡比較的是兩個位址,指向的不是同乙個物件

let str1 =

newstring

('abc'

)let str2 =

'abc'

str1 == str2 //true

str1 === str2 // flase

//邏輯等於,會將不同的型別轉換為相同的型別,所以結果還是等於;邏輯全等,則先比較兩者的資料型別,在看是否引用的同乙份資料

還有一點,在string物件比較的時候,使用了+,要識別編譯器最後能不能將兩個string在編譯階段直降將兩個相加的string合併為乙個,如果能,則合併後的string是放在棧裡面的,如果不能,則在執行時機合併,最後的string是放在堆裡面的。

1. 堆記憶體的釋放

物件資料或者函式型別在定義的時候,首先會開闢乙個堆記憶體,堆記憶體有乙個引用位址,如果外面有引用這個位址,則這個記憶體就被占用了,且不能銷毀。

如果要將堆記憶體釋放(銷毀),只需要把引用它的變數賦值為空即可,當這個堆記憶體沒有任何東西被占用,瀏覽器會在空閒的時候將它銷毀。

2. 棧記憶體的釋放

2.1 全域性作用域

在全域性作用域下,只有當頁面關閉的時候,全域性作用局才會被全銷毀

2.2 私有作用域

一般情況下,函式執行會形成乙個新的私有作用域,當私有作用域中的**執行完成之後,當前作用域都會主動的進行釋放和銷毀

不過依然有特殊的情況存在:當前私有作用域中的部分內容被作用域以外的東西占用了,那麼當前作用域就不能銷毀了,

注意兩個條件:

1.函式返回運用資料型別的值,

2.改應用型別的值在函式外面被乙個其他變數接受了

functionfn(

)}fn(

)();

// 首先執行fn,返回乙個小函式對應的記憶體位址,然後緊接著讓返回的小函式再執行

這種情況不會立即銷毀。

只要某作用域還有被引用,那麼改作用域就不能被銷毀,一單沒有任何變數引用了,改私有作用域就會被銷毀了

MCU的記憶體簡單介紹

1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。這些值是可讀寫的,那麼stack應該被包含在rw data 讀寫資料儲存區 也就是微控制器的sram中。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由o...

JS堆疊記憶體的執行機制

棧記憶體ecstack execution context stack 作用域 js之所以能夠在瀏覽器中執行,是因為瀏覽器給js提供了執行的環境棧記憶體 瀏覽器會在計算機記憶體中分配一塊記憶體,專門用來供 執行 棧記憶體ecstack execution context stack 執行環境棧,每開...

簡單的記憶體取證介紹

定義 通常指對計算機及相關智慧型裝置執行時的物理記憶體中儲存的臨時資料進行獲取與分析,提取有價值的資料。記憶體是作業系統及各種軟體交換資料的區域,資料易丟失 volatile 通常在關機後資料很快就消失。是指利用將記憶體程序寫入映象檔案,通過映象檔案檢視之前記憶體程序的一些資訊。工具介紹 volat...