在 第13天 有提到原始型別(primitive types)和物件型別(object types)的差別。在 JavaScript 中,基本型別(primitive types)包含字串(string)、數字(number)、布林值(boolean)等等,這些基本型別的值是「純值」,它們是不可變的,也沒有方法和屬性。然而我們可能注意到,有時候我們似乎可以對純值使用方法和屬性,例如:
let myMsg = 'hello';
console.log(myMsg.length); // 5
上面例子的 myMsg 是字串型別,而它的值是純值,理論上沒有任何的屬性或方法可用,但實際上它卻可以透過 length 屬性取得字串長度。為什麼會這樣呢?這就要進入今天的主題了:「包裝物件」。
在JavaScript中,包裝物件(wrapper object,或稱 primitive wrapper)
是指原始型別(例如數字、字串、布林值等)的各自對應的的物件,這樣它們就可以使用對應原始型別的屬性和方法。
let str = 'Hello!';
let strObj = new String('Hello!');
console.log(str); // 輸出 'Hello!'
console.log(strObj); // 輸出 String {'Hello!'} 的物件,裡面有對應的屬性或方法可用
console.log(typeof str); // 輸出 'string'
console.log(typeof strObj); // 輸出 'object'
JavaScript 引擎會在需要的時候自動處理原始型別和包裝物件的轉換了。因此在實際開發時,我們不需要也應盡量避免直接使用這些包裝物件,因為它們已不是我們認知上的純值,而是屬於物件。
let str = 'Hello!';
// 在這裡,JavaScript 暫時將 str 轉換為 String 物件,以調用 length 屬性
let strLength = str.length;
console.log(strLength); // 輸出 5
let num = 10;
// 在這裡,JavaScript 暫時將 num 轉換為 Number 物件,以調用 toString 方法
let numToString = num.toString();
console.log(numToString); // 輸出: 字串的 '10'
JavaScript 中原始型別的自動包裝機制,使得開發者可以在純值上使用物件的方法和屬性,但又保留純值的特性。這提供了更多的便利性,但身為開發者仍需知道背後的原理。那麼今天就到這邊,我們明天見。