普通類型和對象區別

繼數據類型衍生來學習普通類型和對象區別

普通類型

普通類型也可以叫做基本類型或原始類型(string, boolean, number, symbol, null, undefined)
如需要了解各種類型使用 -> 詳細JS 數據類型

在JS 普通類型的變數直接保存原始值。當我把原始值賦給一個變數時,該值將被複製到變數中。

// 例子
let a1 = 'A'
let a2 = a1

示意圖

字串A值賦給a1變數,然後a1變數賦給a2變數。這樣a2變數保存了字串A值,看上去a1和a2具有相同的值,但是它們兩是毫無關聯,改變a1的值是不會影響a2值。
因為存在兩個不同存儲地址,簡單說每個原始值的變數都是使用自己存儲空間,普通類型存在stack內存裡。

// 例子
let a1 = 'A'
let a2 = a1

a1 = 'AA'
console.log(a1) // 'AA'
console.log(a2) // 'A'

如果要鑑定普通類型最佳方法是使用typeof,它可以被用在任何變數,return數據類型。

typeof "decade" //"string"
typeof 11 //"number"
typeof 2.2 //"number" 無論整數還是小數點都是number
typeof true //"boolean"
typeof undefined //"undefined"
typeof null //"object" 早期 JS BUG

對象類型

Object類型也可以叫做複雜類型或引用類型(Object)
如需要了解各種類型使用 -> 詳細JS 數據類型

引用類型的值是保存在堆Heap內存空間裡。在JS不允許直接訪問以及操作堆內存空間。
實際上是在操作對象的引用而不是實際的對象,至於引用可以理解保存在棧Stack內存中的一個地址,此地址與堆內存對象有關聯。

當我們要訪問heap內存的對象時,實際上是通過stack內存裡地址去訪問

引用類型複製同樣會為新的變數同一個地址在stack內存裡。o1和o2對象在stack裡地址,透過地址去訪問heap內存裡對象。
如o2對象裡屬性更改,也會發生變化,這就是普通類型和對象類型區別
例子:

垃圾回收機制

JS有自動垃圾回收機制,也就是說,執行環境會負責管理程式執行過程中使用的內存。
這種垃圾回收機制原理,JS會創建變數,對象,字串… 時自動分配內存,找出不再使用的變數,然後釋放它所佔用的內存

  • 分配內存 - 內存由作業系統OS分配
  • 使用內存 - 使用已經分配的內存,進行程式執行讀和寫
  • 釋放內存 - 當不用的時候,會自動釋放內存

總結

普通類型的 a = 3, b = a, b = 12 a和b變數互不影響
對象類型 a = {name: ‘a’}, b = a, b.name = ‘p’ b變會直接影響a

參考資料