1. 程式人生 > >資料型別(基本資料型別、引用資料型別)以及堆和棧的區別

資料型別(基本資料型別、引用資料型別)以及堆和棧的區別

js資料型別:基本資料型別和引用資料型別(文章最下面會介紹各型別的基礎以及注意事項

基本資料型別指的是簡單的資料段,引用資料型別指的是有多個值構成的物件

當我們把變數賦值給一個變數時,解析器首先要確認的就是這個值是基本型別值還是引用型別值

基本資料型別:數字(Number)、字串(String)、布林(Boolean)、空(Null)、未定義(Undefined)

引用資料型別:也就是物件型別Object type,比如:Object 、Array 、Function 、Data等

基本資料型別

基本資料型別是按值訪問的,因為可以直接操作儲存在變數中的實際值

var a = 1;
var b = a;//b獲取的是a值得一份拷貝,雖然,兩個變數的值相等,但是兩個變數儲存了兩個不同的基本資料型別值
b = 2;
console.log(a); // 1

b只是儲存了a複製的一個副本。所以,b的改變,對a沒有影響。

下圖演示了這種基本資料型別賦值的過程:

棧(stack):棧會自動分配記憶體空間,會自動釋放,存放基本型別,簡單的資料段,佔據固定大小的空間。

所有在方法中定義的變數都是放在棧記憶體中,隨著方法的執行結束,這個方法的記憶體棧也自然銷燬 

優點:存取速度比堆快,僅次於直接位於CPU中的暫存器,資料可以共享; 
缺點:存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。

棧:可以遞迴呼叫方法,這樣隨著棧深度的增加,JVM維持著一條長長的方法呼叫軌跡,知道記憶體不夠分配,產生棧溢位。

引用型別資料

javascript的引用資料型別是儲存在堆記憶體中的物件。

與其他語言的不同是,你不可以直接訪問堆記憶體空間中的位置和操作堆記憶體空間。只能操作物件在棧記憶體中的引用地址。

所以,引用型別資料在棧記憶體中儲存的實際上是物件在堆記憶體中的引用地址。通過這個引用地址可以快速查詢到儲存中堆記憶體中的物件。  

var obj1 = new Object();
var obj2 = obj1;
obj2.name = "葉落森";
console.log(obj1.name); //葉落森

說明這兩個引用資料型別指向了同一個堆記憶體物件。obj1賦值給onj2,實際上這個堆記憶體物件在棧記憶體的引用地址複製了一份給了obj2,但是實際上他們共同指向了同一個堆記憶體物件。實際上改變的是堆記憶體物件。(這裡就會引出深拷貝和淺拷貝問題,這裡是淺拷貝,具體的見我的部落格堆和棧的區別,來解析——

https://blog.csdn.net/xiasohuai/article/details/81086480

下面我們來演示這個引用資料型別賦值過程:

各型別的基礎以及注意事項

1.Number型別

Number型別包含整數和浮點數(浮點數數值必須包含一個小數點,且小數點後面至少有一位數字)兩種值。

NaN:非數字型別。特點:① 涉及到的 任何關於NaN的操作,都會返回NaN   ② NaN不等於自身。

isNaN() 函式用於檢查其引數是否是非數字值。

isNaN(123)  //false   isNaN("hello")  //true

2.String型別

字串有length屬性。

字串轉換:轉型函式String(),適用於任何資料型別(null,undefined 轉換後為null和undefined);toString()方法(null,defined沒有toString()方法)。

3.Boolean型別

該型別只有兩個值,true和false

4.Undefined型別

只有一個值,即undefined值。使用var聲明瞭變數,但未給變數初始化值,那麼這個變數的值就是undefined。

5.Null型別

null型別被看做空物件指標,前文說到null型別也是空的物件引用。

6.Object型別

js中物件是一組屬性與方法的集合。這裡就要說到引用型別了,引用型別是一種資料結構,用於將資料和功能組織在一起。引用型別有時候也被稱為物件定義,因為它們描述的是一類物件所具有的屬性和方法。