Reference type以及Value type

在Javascript程式語言,Reference Type和Value Type是兩種不同的資料型別,它們在記憶體中的儲存和操作方式不相同。

Value Type

儲存的是數據本身
資料存放於Stack

Value type變數,這個變數會儲存數據本身

Value type有以下資料型態

  • number(包括整數、浮點數)
  • string
  • boolean
  • undefined
  • null
  • symbol

當將一個Value type變數賦值給另一個變數時,將複製實際的數據

用Javascript舉例子

1
2
3
4
5
6
let a = 10
let b = a
b = b + 1

console.log(`a = ${a}`) //印出a = 10
console.log(`b = ${b}`) //印出b = 11

Reference Type

儲存的是記憶體位置
資料存放於Heap

Reference type有以下資料型態

  • object(包括class)
  • function
  • array

當一個reference type的變數賦值給另一個變數時,它們將指向同樣的記憶體位置

用Javascript舉例子

1
2
3
4
5
6
let a = [1,2,3]
let b = a
b.push(7)

console.log(`a = ${a}`) //印出a = 1,2,3,7
console.log(`b = ${b}`) //印出b = 1,2,3,7

這個例子中
變數a是array陣列,變數a屬於reference type,儲存的是記憶體位置
a賦值給b,它們兩個變數指向同一個記憶體位置
變數b加進7之後
最終,a和b指向的記憶體位置的數值變成[1,2,3,7]

另外
我們可以用”比較運算符”去測試
=== 值和類型這2個是否完全相等
== 值是否相等

1
2
3
4
5
let c = [4,5]
let d = [4,5]

console.log(c === d) //false
console.log(c == d) //false

這個例子中,為什麼c怎麼樣都不等於d?

由於array陣列是Reference Type
===和==變成比較的是記憶體位置
c的記憶體位置和d的記憶體位置完全不同
所以都是false

除非改成以下程式碼

1
2
3
4
5
let c = [4,5]
let d = c

console.log(c === d) //true
console.log(c == d) //true

將變數c賦值給變數d,它們指向同一個記憶體位置