堆疊(stack)和堆疊(heap)
stack為自動分配的內存空間,它由系統自動釋放;而heap則是動態分配的內存,大小不定也不會自動釋放。
基本型別:存放在堆疊記憶體中的簡單資料段,資料大小決定,記憶體空間大小可以分配。
基本資料類型有Undefined、Null、Boolean、Number 和String,他們的值是直接存放在堆疊中;
引用類型:存放在堆記憶體中的物件的值,由位址指標與值組成,位址保存在堆疊中,實際的值保存在堆中,堆中的每個空間大小不一樣,根據情況進行特定的分配。當我們需要存取參考型別(如對象,數組,函數等)的值時,首先從棧中獲得該對象的地址指針,然後再從堆內存中取得所需的數據;
var s='str',t= 0,floatNum=1.1; var obj={ a:10, b:'Joel', c:function(){ console.log('function'); } }
如上圖所示:
基本資料類型值是保存在堆疊中,引用類型的物件參考是保存在堆疊中,值是保存在堆中;
基本類型:儲存在堆疊(stack)中的簡單資料段,它們的值直接儲存在變數存取的位置。這是因為基本類型佔據的空間是固定的,所以可將他們儲存在較小的記憶體區域 – 堆疊中,這樣儲存便於迅速查詢變數的值。
引用類型:儲存在堆疊(heap)中的對象,儲存在堆疊中的值是一個指針(point)用於指向儲存對象的記憶體位址,這是因為引用類型值的大小會改變,所以不能把它放在堆疊中,否則會降低變數查尋的速度。相反存在堆疊中的值是該物件位址而位址的大小是固定的,所以把它儲存在堆疊中對變數效能無任何影響。
在javascript中是不允許直接存取保存在堆記憶體中的物件的,所以在存取一個物件時,首先訪問記憶體堆疊得到這個物件在記憶體堆中的位址,然後再按照這個位址去獲得這個物件中的值,這就是傳說中的按引用訪問,而基本型別的值則是直接記憶體棧中。
基本類型:在將一個保存著原始值的變數複製給另一個變數時,會將原始值的副本賦值給新變量,此後這兩個變數是完全獨立的,他們只是擁有相同的value而已。
引用類型:在將一個保存著物件記憶體位址的變數複製給另一個變數時,會把這個記憶體位址賦值給新變量,也就是說這兩個變數都指向了堆記憶體中的同一個對象,他們中任何一個人所做的改變都會反映在另一個身上。 (這裡要理解的一點就是,複製對象時並不會在堆內存中新生成一個一模一樣的對象,只是多了一個保存指向這個對象指針的變量)多了一個指針。
ECMAScript中所有函數的參數都是按值來傳遞的,但是為什麼涉及到原始類型與引用類型的值時仍然有差別呢?還不就是因為記憶體分配時的差別。
基本資料型態:只是把變數裡的值複製一個副本然後傳遞給參數,之後參數和這個變數互不影響。
引用型別:因為它傳遞的值是記憶體位址,所以都是指向同一個物件;
以上是關於js中基本資料型別、引用資料型別區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!