在學習 JavaScript 時,你有沒有遇過「字串不能改」、「複製變數並修改新變數後,舊變數也跟著變了」諸如此類的狀況? (我有) 其實這和 JavaScript 的資料型別還有傳值(Pass by value)、傳參考(pass by reference) 運作機制有關,如果沒有這些概念的話,程式開發過程中就很容易發生非預期的情況,為了避免再次發生這些看似怪異的狀況,需要從根本了解他們的差異。
JavaScript 的兩大資料類型
JavaScript 有兩種內建的資料型別,分別為原始型別(Primitive values) 與物件類別(objects)。
Primitive 是 JavaScript 的基礎資料單位,共有七種 :
- number
- string
- boolean
- bigInt
- symbol
- undefined
- null
原始型別 Primitive
Primitive 是「值類型」、「不可變」。
值類型 (value type):
值類型指的是,當把一個 Primitive 賦予變數時,變數存的就是值本身,而非記憶體位置。因此在複製或傳遞時,實際上是複製該值,而非共享一個資料。let a = 10;
let b = a; // b 存的是 10,而非 a 的位置(複製 a 的值賦予 b)
b = 1;
console.log(a)// 修改 b 不會影響到 a,仍是 10
不可變 (immutable):
不可變的意思是,值一旦建立就無法修改,只能用「新值」取代「舊值」
let s = "Hello world";雖然可以用
s[0] = "h"; // 無效,字串不會被修改,但也不會報錯
console.log(s); // Hello world
s = "hello world"; // 有效,這是重新賦值,不是修改
console.log(s); // hello world
s[0] 讀取值,但是🚫無法用s[0]=”h” 修改 string 的內容。對 primitive value 來說,看起來像是「修改」的動作其實都是產生新值並重新指派。
物件 Object
除了開頭提到的七種 Primitive 外,其他的都屬於 Object (像是 Array、Function、Object、Date 等)
Object 是「參考類型」、「可變」
參考類型 (reference type)
參考類型的意思是,變數存的是指向該 Object 的參考,而非值本身。所以當多個變數指向同一個 Object 時,透過任一個變數修改內容,所有變數都會受到影響。
let d = { x: 1};
let e = d; // e 被賦值為 d 所指向的物件參考,也就是 e 與 d 指向相同物件
e.x = 2; // 這是修改物件內容,不是讓 e 指向新的物件
console.log(d); // 輸出: { x: 2},因為修改 e 的值,也會影響到 d
可變(mutable)
相對於不可變,可變指的是,Object 的內容是可以被更修改的。
let arr = ["h", "e", "l", "l", "o"];
arr[0] = "H"; // 可以修改
console.log(arr); // ['H','e','l','l','o']
總結
JavaScript 的資料類型中,除了七個 Primitive:number、bigInt、boolean、string、symbol、null、undefined 之外,其他都屬於 Object。
- Primitive:值類型、不可變
- Object:參考類型、可變
理解 JavaScript 的資料結構才能在程式開發上少走很多彎路,因為自己踩過對於程式語言特性一知半解的坑,透過整理筆記的方式加深印象,除了自己未來可以反覆觀看外,也希望筆記可以幫助同在學習的人~




















