HAPPY LIFE AND cODING

JS-值類型與引用類型

JS-值類型與引用類型

JS中變數有許多種資料類型,但主要可以分別2大類。分別為 值類型 (簡單數據類型)和 引用類型(複雜數據類型)。

值類型包含: 字串(String)、數字(Number) 、布林(Boolean)、布林(Symabol)、Undefine。

引用類型包含: 陣列(Array)、物件(Object)、涵數(Function)、Null。

至於這2類有甚麼不同呢? 這就要說到有二句話『call by value』和 『call by reference』。一般來說JS在做變數賦值時,會在記憶體中開闢2塊空間,分別是 棧內存(Stack) 和 堆內存 (Heap)。如果是 值類型 則會把東西存放在棧內存(Stack)中。反之,引用類型則放在堆內存 (Heap)裡。我們可以畫個圖說明一下。

值引用

  1. 一開始我們會有 defaultName = jessica,此時在記憶體中,會用 key value 方式來儲存。
  2. 接者,name1 = defaultName,同理,在記憶體又會增加一個位子,來存放。
  3. name1 改變名子,當然它的值也會跟者改變。

其實,可以總結。值引用自己變數的值想怎麼修改,其實都不會影響到其它邊數的值。

參考引用

  1. person 是一個物件,它會在棧內存中,開闢一個空間,來存放資料。然後它的值事實上是對應 堆內存的地址0x01。
  2. 接者,person1= person,它門會指向同一個堆內存地址。
  3. 當 person1.name 改變,因為指向的是同一個地址,所以person物件,也會受到影響。
  4. 如果當 person1 從新賦值一個新物件時,此時,堆內存中會開闢一個新參考位置,並將 person1 的值指向地址0x02。

引用類型的變數的值,如果和其它變數是同一個參考,那就會影響到其它變數的值。如果想解決這問題,就需要用到深拷貝來解決。