1. 程式人生 > 實用技巧 >module2-04-簡單型別和復據型別的儲存

module2-04-簡單型別和復據型別的儲存

簡單型別和複雜型別

一、簡單型別和複雜型別的區別

  • 基本型別又叫值型別,複雜型別又叫引用型別

  • 值型別:簡單資料型別,基本資料型別,在儲存時,變數中儲存的是值本身,因此叫做值型別

  • 引用型別:複雜資料型別,在儲存時,變數中儲存的僅僅是地址(引用)

堆和棧

  • JS中沒有堆和棧的概念,但是可以用這個來講解

    • 簡單的資料就會儲存到棧(複雜型別的引用也會在這裡)

    • 複雜型別的資料就會儲存到堆(需要人工銷燬,現在js有自己的垃圾清除機制)

  • 棧(作業系統):有作業系統自動分配釋放,存放函式的引數值,區域性變數等

  • 堆(作業系統):儲存複雜型別(物件),一般有程式設計師分配釋放,若程式設計師不釋放,由辣雞回收機制回收

二、基本型別在記憶體中的儲存

  • 變數中儲存的是值本身,如果將變數賦值給另一個變數,是將內部的值賦值一份給另外一個變數,兩個變數沒有聯絡,其中一個變化,另外一個不會發生變化

  • 兩個空間是獨立開的,當講number賦值給n,其實是將值賦值過去(前提number儲存的是簡單變數),其中是沒有聯絡的

三、複雜型別在記憶體中的儲存

  • 如果講複雜型別的資料賦值給一個變數,複雜型別的資料會在記憶體中建立一個原型,而變數中儲存的是指向物件的一個地址。如果講變數賦值給另外一個變數,相當於將地址複製一份給了新的變數,兩個變數的地址相同指向的是同一個原型,其中一個訪問並改變了,另一個變數也會改變

var p1 = { name: 'zs', age: 18 }
p2 = p1
p2.age = 20
p1 // { name: 'zs', age: 20 }
p2 // { name: 'zs', age: 20 }
  • 陣列也是複雜資料型別,所以陣列也有這樣的特性