1. JavaScript變量
基本類型值在內存中占據固定大小的空間 因此被保存在棧內存中。
從一個變量向另一個變量復制基本來下的值 會創建這個值得一個副本。
引用類型的值是對象 保存在堆內存中。
包含引用類型值得變量實際上包含的並不是對象本身 而是一個指向該對象的指針。
從一個變量向另一個變量復制引用類型的值 復制的其實是指針 因此兩個變量最終都指向同一個對象
2. 堆和棧
堆棧在數據結構里面的含義就是一組數據的存放方式 后進先出
push: 在最頂層加入數據
pop: 返回並移除最頂層的數據
top: 返回最頂層數據的值 但不移除
isempty: 返回一個布爾值 表示當前stack是否為空棧
Stack 是一種存放數據的內存區域。系統會划分出兩張不同的內存空間 stack(棧) 和堆(heap)
stack (棧)是有結構的(就像后進先出 從下到上) 每一個區域都按照一定次序存放,可以明確知道每個區塊的大小。 heap是沒有結構 數據可以任意存放。因此stack的尋址速度要快於heap。
一般來說 每個線程分配一個stack(棧) 每個進程分配一個heap。就是說 stack獨占線程,heap是共享線程。
所以 數據存放的規則是 只要是局部的 占用空間確定的數據 一般都存放在stack里面。否則就放在heap里面。局部變量一旦運行結束 就會GC回收 而heap的那個對象實例直到系統的GC將這里的內存回收。因此一般內存泄漏都方生在heap。
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,這些洗碗 后續工作好像就是垃圾回收 不用我們自己動手。他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,但是要我們自己動手去收拾這些 東西 洗碗等等 而且自由度大。