js在定義變量時完成了內存的分配
?
js具有自動垃圾回收機制,垃圾回收器會每隔固定的一段時間就執行一次釋放操作,即找出那些不再繼續使用的值,釋放其占用的內存
?
js中最常用的是通過標記清除的算法來找到哪些對象是不再繼續使用的,因此a=null只是做了釋放引用的操作,讓a原本對應的值失去引用,脫離執行環境,這個值會在下一次垃圾回收器執行時被找到并釋放,在適當的時候解除引用,是為頁面獲得更好性能的一個重要方式
?
在局部作用域中,當函數執行完畢,局部變量也就沒有存在的必要了,因此垃圾回收器很容易做出判斷并回收。但是全局變量什么時候需要自動釋放內存空間則很難判斷,因此在我們的開發中,需要盡量避免使用全局變量,以確保性能
?
與C和C++不同,js沒有在嚴格意義上區分堆內存和棧內存
?
可以粗淺地理解為js的所有數據都存在堆內存中
?
執行上下文在邏輯上實現了堆棧,需要基于堆棧數據結構的思路來理解執行上下文
?
棧空間的存儲原理:先進后出,后進先出
?
js的執行上下文生成之后會創建一個叫變量對象的特殊對象,基本數據類型往往保存在變量對象中
?
嚴格意義上講,變量對象也存在堆內存中,但是變量對象的特殊職能,在理解時仍然與堆內存區分開
?
基礎數據類型都是按值訪問,因此可以直接操作保存在變量中的實際值
?
與其他語言不同,js的引用數據類型,比如數組,值的大小是不固定的,引用數據類型的值是保存在堆內存中的對象,js不允許直接訪問堆內存中的位置,因此不能直接操作對象的堆內存空間,在操作對象時,實際上是在操作對象的引用,而不是實際的對象
?
引用類型的值是按引用訪問的,這里的引用可以粗淺理解為保存在變量對象中的一個地址,該地址與堆內存的實際值相關聯。當要訪問堆內存中的引用數據類型時,實際上是首先從變量對象中獲取該對象的地址引用,然后再從堆內存中取得需要的數據
?
在變量對象中數據發生復制行為時,系統會自動為新的變量分配一個新值
?
引用類型的復制同樣也會為新的變量自動分配一個新的值保存在變量對象中。不同的是,這個新的值,只是引用類型的一個引用地址,當引用地址相同時,盡管它們相互獨立,但在變量對象中訪問到的具體對象實際上是同一個