iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
自我挑戰組

複習 JavaScript 核心概念系列 第 19

[Day 19] 純值卻有屬性可用?關於「包裝物件(wrapper object)」

  • 分享至 

  • xImage
  •  

第13天 有提到原始型別(primitive types)和物件型別(object types)的差別。在 JavaScript 中,基本型別(primitive types)包含字串(string)、數字(number)、布林值(boolean)等等,這些基本型別的值是「純值」,它們是不可變的,也沒有方法和屬性。然而我們可能注意到,有時候我們似乎可以對純值使用方法和屬性,例如:

let myMsg = 'hello';
console.log(myMsg.length); // 5

上面例子的 myMsg 是字串型別,而它的值是純值,理論上沒有任何的屬性或方法可用,但實際上它卻可以透過 length 屬性取得字串長度。為什麼會這樣呢?這就要進入今天的主題了:「包裝物件」。


什麼是「包裝物件(wrapper object)」

在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 中原始型別的自動包裝機制,使得開發者可以在純值上使用物件的方法和屬性,但又保留純值的特性。這提供了更多的便利性,但身為開發者仍需知道背後的原理。那麼今天就到這邊,我們明天見。


上一篇
[Day 18] 物件(Objects)的基本架構
下一篇
[Day 20] 物件的傳參考特性、淺層複製和深層複製
系列文
複習 JavaScript 核心概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言