1.兩種值類型與數據類型的關係
基本類型:
(亦作原始類型)
簡單的數據段。
包含的數據類型有:Undefined、Null、Boolean、Number、String.
引用類型:
由多個值構成的對象。
包含的數據類型有:Array 、 Object 、 function 、Date 、RegExp.數組
2.兩種數據值類型與內存分配
JS內存空間分爲棧(stack)、堆(heap)、池(通常會歸類爲棧中)。棧內存有序排列,而且大小固定。堆內存無需排列,大小不固定。函數
(1).基本類型 :
基本類型值大小固定,變量值存放在棧內存中。.net
基本類型值初始化:當用var關鍵字聲明初始化一個變量以後,將變量名與一個棧內存地址綁定,並將變量的值存放在該地址的空間內。指針
基本類型值之間賦值:當基本類型之間發生變量的賦值操做時,會將棧空間中的值進行copy,並將該副本賦值給另外一個變量,存放在另外一個變量名綁定的內存空間中。變量值改變不會相互影響。對象
基本類型值重賦值(不可改變的原始值):若是對一個已經聲明瞭的變量從新賦值,實際上是切斷了該變量與內存地址之間的綁定聯繫,將指針指向了新的棧空間,並將新值存在新空間內。以前地址就變成了野房間,野房間內的數據也不會憑空銷燬,直到下一次與變量綁定時,被變量值覆蓋。blog
(2).引用類型:內存
引用類型因爲能夠修改,能夠無論的擴充成員,因此它們的大小是沒法肯定的,會下降變量查尋的速度,所以沒法放在棧內存中。因此要保存一個引用類型,須要在堆內存中開闢一塊空間去保存引用類型的數據。io
引用類型值初始化:引用類型的值存放在堆中。變量名綁定的棧空間內存放的是一個指針,存放16進制的地址值,大小固定,因此存放在棧中,該地址就是變量值所在的堆地址。function
引用類型值間賦值:該賦值不一樣與基本類型值之間的賦值。當賦值發生時,拷貝的依然是棧空間內的內容。但因爲這是一個地址值,因此兩個引用類型變量所指的就是同一個堆空間。此時,變量值改變會相互影響。class
經過函數方法對對象進行改變,例如數組的push(),splice()等方法,實際上也是經過指針尋址,並在原來的變量值上作修改,因此依然是會相互影響的。
引用類型值重賦值:引用類型重賦值,在堆中開闢了一個新房間,並將棧中指針指向了新的堆地址。此時,a、b變量值改變就不會相互影響了。
3.兩種數據值類型與內存訪問機制因爲在內存中存放形式不一樣,因此兩種的對變量的訪問機制也不一樣。基本類型是按值訪問,能夠直接獲得變量值。引用類型則是按引用訪問。在訪問引用類型的值是先獲得存該值的地址,再經過該地址獲得變量值--------------------- 做者:zhengxue_er 來源:CSDN 原文:https://blog.csdn.net/qq_38177305/article/details/84451478 版權聲明:本文爲博主原創文章,轉載請附上博文連接!