1. 程式人生 > 其它 >簡單資料型別與複雜資料型別

簡單資料型別與複雜資料型別

簡單型別於複雜型別
簡單型別又叫做基本資料型別或者值型別,複雜型別又叫做引用型別。

值型別:簡單資料型別/基本資料型別,在儲存時變數中儲存的是值本身,因此叫做值型別
string ,number,boolean,undefined,null
引用型別:複雜資料型別,在儲存時變數中儲存的僅僅是地址(引用),因此叫做引用資料型別
通過 new 關鍵字建立的物件(系統物件、自定義物件),如 Object、Array、Date等

堆和棧
堆疊空間分配區別:

棧(作業系統):由作業系統自動分配釋放存放函式的引數值、區域性變數的值等。其操作方式類似於資料結構中的棧;
簡單資料型別存放到棧裡面
堆(作業系統):儲存複雜型別(物件),一般由程式設計師分配釋放,若程式設計師不釋放,由垃圾回收機制回收。
複雜資料型別存放到堆裡面

 

 注意:JavaScript中沒有堆疊的概念,通過堆疊的方式,可以讓大家更容易理解程式碼的一些執行方式,便於將來學習其他語言。

簡單型別的記憶體分配

  • 值型別(簡單資料型別): string ,number,boolean,undefined,null
  • 值型別變數的資料直接存放在變數(棧空間)中

 

 

 

  • 引用型別(複雜資料型別):通過 new 關鍵字建立的物件(系統物件、自定義物件),如 Object、Array、Date等
  • 引用型別變數(棧空間)裡存放的是地址,真正的物件例項存放在堆空間中

     

    簡單型別傳參

    函式的形參也可以看做是一個變數,當我們把一個值型別變數作為引數傳給函式的形參時,其實是把變數在棧空間裡的值複製了一份給形參,那麼在方法內部對形參做任何修改,都不會影響到的外部變數。

  複雜型別傳參

   函式的形參也可以看做是一個變數,當我們把引用型別變數傳給形參時,其實是把變數在棧空間裡儲存的堆地址複製給了形參,形參和實參其實                   儲存的是同一個堆地址,所以操作的是同一個物件。

 // 複雜資料型別傳參
  function Person(name) {
    this.name = name;
  }

  function f1(x) { // x = p
    console.log(x.name); // 2. 這個輸出什麼 ?  劉德華   
    x.name = "張學友";
    console.log(x.name); 
// 3. 這個輸出什麼 ? 張學友 } var p = new Person("劉德華"); console.log(p.name); // 1. 這個輸出什麼 ? 劉德華 f1(p); console.log(p.name); // 4. 這個輸出什麼 ? 張學友