JS進階丨01. 內存空間詳解

大綱:JS中並沒有嚴格意義上區分棧內存與堆內存

三種數據結構:堆(heap),棧(stack)與隊列(queue)

 

一、棧(stack):棧數據結構棧空間先進後出,後進先出

應用:執行上下文的執行順序  借用了棧數據結構的存取方式

 

二、隊列(queue):是一種先進先出(FIFO)的數據結構

應用:事件循環(Event Loop)的機制

 

三、堆(heap):堆數據結構是一種樹狀結構。

它的存取數據的方式,則與書架與書非常相似。

好比在JSON格式的數據中,
我們存儲的key-value是可以無序的,
因爲順序的不同並不影響我們的使用

 


四、變量對象與基礎數據類型

1.  JS的執行上下文生成之後,會創建變量對象,JS的基礎數據類型會保存在變量對象。

2. 變量對象也是存放於堆內存中,但由於變量對象的特殊職能,
我們在理解時仍然需要將其於堆內存區分開來。


3.  基礎數據類型:Undefined、Null、Boolean、Number、String
     ES6中新加了一種基礎數據類型Symbo


五、引用數據類型與堆內存

Array、Object、function

1.  JS不允許直接訪問堆內存中的位置,不能直接操作對象的堆內存空間。

2.  在操作對象時,實際上是在 操作對象的引用 ,不是實際的對象。
     引用類型的值都是按引用訪問的:保存在變量對象中的一個地址,該地址與堆內存的實際值相關聯;


六、內存空間管理

JS的內存生命週期

1. 分配你所需要的內存

2. 使用分配到的內存(讀、寫)

3. 不需要時將其釋放、歸還

案例:
var a = 20;  // 在內存中給數值變量分配空間
alert(a + 100);  // 使用內存
a = null; // 使用完畢之後,釋放內存空間

1.  局部變量容易判斷並回收:
     在局部作用域中,當函數執行完畢,局部變量沒有存在的必要,垃圾收集器很容易做出判斷並回收。

2.  全局變量儘量避免使用:
     全局變量什麼時候需要自動釋放內存空間則很難判斷,
     在開發中,儘量避免使用全局變量。


標記清除法:標記清除的算法來找到哪些對象是不再繼續使用的,

操作方式:a = null  其實僅僅只是做了一個釋放引用的操作,

實現原理:
讓 a 原本對應的值失去引用,脫離執行環境,
這個值會在下一次垃圾收集器執行操作時被找到並釋放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章