JS內存空間

前言:從JavaScript自動垃圾回收機制說起


我們都知道JavaScript具有自動垃圾回收機制,內存的分配和回收都現實了自動管理,這樣內存空間的知識容易被我們忽視,但是知道JavaScript是如何在內存中進行數據的存儲,可以更好幫助我們理解引用數據類型和引用傳遞是怎麼回事,還有閉包、原型等等。

0x01.說說堆和棧


其實在JavaScript中並沒有嚴格意義上的棧內存和堆內存的區分,但是堆內存和棧內存依舊是有本質的差別,理解堆棧數據結構的原理和特點也很重要

棧的主要遵循先進後出,後進先出的特點


圖中用兵兵球盒子與棧內比,那麼通過圖片可以理解當我們想取出兵兵球1的時候,就必須先將上面的4個球給取出來(依次出棧),這樣讓兵兵球1處於棧頂,這也是棧空間先進後出,後進先出的特點

這裏寫圖片描述


通過棧空間的工作特點我們知道有時候我們取一些底層的數據並不方便,那麼堆空間可以很好的解決這個問題,堆存儲數據的原理可以理解爲一種key-value的方式,我們知道在JSON格式的數據中,存儲的方式就是鍵值對的,這種方式存儲的數據是無序的,方便我們查找調用。

0x02.變量對象和基礎數據類型


我們知道在JavaScript中有5種基礎的數據類型,分別是Undefine、Null、Boolean、Number、String,這些基礎的數據類型都是一些簡單的數據段,通常我們將其保存在一個叫做變量對象(一種特殊對象)中。基本的數據類型都是按值訪問,因此可以直接操作保存在變量中的值。

0x03引用數據類型與堆內存


在JS的引用數據類型中,如數組Array,它的值大小是不固定的,引用數據類型的值是保存在堆內存中的對象(object)。但是在JS中是不允許直接訪問堆內存中的位置的,因而在實際操作對象的時候我們我們是從變量對象中訪問對象的地址引用(這裏可以理解爲一種地址指針),然後再通過從堆內存中獲取我們所需要的數據。

這裏寫圖片描述

在對象b、c中對應的值是存儲的地址,通過該地址來取堆內存中存儲的數據。

dome

var m ={a:10,b:15}
var n=m;
n.a=15
//此時m.a的值?

當通過var n=m 執行的是一次複製引用類型的操作,引用類型的複製會爲新的變量分配一個新的值保存在變量對象中,需要注意的是這個值只是引用類型的一個地址指針,因此儘管m和n在變量對象的相互獨立,但是他們指向的堆內存空間的具體對象是一致的。

這裏寫圖片描述

因此當我們改變n的時候,m也發生了變化,這就是引用類型的特性!

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