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













