JavaScript中的變量分爲基本類型和引用類型。函數
1.基本類型spa
基本類型有Undefined、Null、Boolean、Number 和String。這些類型在內存中分別佔有固定大小的空間,他們的值保存在棧空間,咱們經過按值來訪問的。xml
2.引用類型對象
引用類型,值大小不固定,棧內存中存放地址指向堆內存中的對象。是按引用訪問的。棧內存中存放的只是該對象的訪問地址,在堆內存中爲這個值分配空間。因爲這種值的大小不固定,所以不能把它們保存到棧內存中,由於系統不知道須要多大,因此程序本身申請,這樣就分配在堆裏面。但內存地址大小的固定的,所以能夠將內存地址保存在棧內存中。 這樣,當查詢引用類型的變量時, 先從棧中讀取內存地址, 而後再經過地址找到堆中的值。對於這種,咱們把它叫作按引用訪問。生命週期
3.爲何有棧內存,堆內存之分ip
爲了使程序運行時佔用的內存最小。當一個方法執行時,每一個方法都會創建本身的內存棧,在這個方法內定義的變量將會逐個放入這塊棧內存裏,隨着方法的執行結束,這個方法的內存棧也將天然銷燬了。所以,全部在方法中定義的變量都是放在棧內存中的;內存
當咱們在程序中建立一個對象時,這個對象將被保存到運行時數據區中,以便反覆利用(由於對象的建立成本一般較大),這個運行時數據區就是堆內存。堆內存中的對象不會隨方法的結束而銷燬,即便方法結束後,這個對象還可能被另外一個引用變量所引用(方法的參數傳遞時很常見),則這個對象依然不會被銷燬,只有當一個對象沒有任何引用變量引用它時,系統的垃圾回收機制纔會在覈實的時候回收它。作用域
因此棧上分配的內存系統自動釋放,堆上分配的內存,系統不釋放,哪怕程序退出,那一塊內存仍是在那裏。變量
4.執行環境垃圾回收