JavaScript中的包裝型別詳解
- 在 JavaScript 中,我們有基本型別和物件型別兩種資料型別。
- 基本型別包括
String
,Number
,Boolean
,null
,undefined
和Symbol
。然而,當我們需要在這些基本型別上呼叫方法時,就需要用到 JavaScript 的包裝型別。
什麼是包裝型別?
- 包裝型別是 JavaScript 中的一種特殊物件,它們將基本型別的值“包裝”在物件中,使我們能夠在基本型別上呼叫方法。JavaScript 提供了三種包裝型別:
String
,Number
和Boolean
。 - 例如,當我們在一個字串上呼叫方法時,JavaScript 會臨時將其轉換(或者說“包裝”)為一個物件,這樣就可以呼叫方法了。
var str = 'hello';
console.log(str.toUpperCase()); // 輸出 "HELLO"
- 在這個例子中,
str
是一個字串基本型別,但我們可以在它上面呼叫toUpperCase
方法。這是因為 JavaScript 在後臺臨時將str
包裝成了一個String
物件,然後在這個物件上呼叫了toUpperCase
方法。
包裝型別的特性
- 值得注意的是,這種包裝只是臨時的,呼叫方法後,基本型別值會恢復到原來的狀態。這就是所謂的包裝型別。
- 此外,雖然
null
和undefined
也是基本型別,但它們沒有對應的包裝型別,也沒有可以呼叫的方法。
包裝型別的注意事項
- 雖然包裝型別在 JavaScript 中非常有用,但在使用時也需要注意一些問題。例如,雖然
Boolean
物件是一個包裝型別,但它在布林上下文中總是被視為true
,無論它包裝的值是true
還是false
。這可能會導致一些意想不到的結果。
var bool = new Boolean(false);
if (bool) {
console.log('run?'); // 會進到 if 條件裡面嗎?
}
- 在這個例子中,
bool
是一個Boolean
物件,其包裝的值為false
。然而,因為bool
是一個物件,所以在if
語句中,它被視為true
,所以console.log
語句總是會執行。所以列印出run?
。 - 總的來說,包裝型別是 JavaScript 中一個重要的概念,它讓我們能夠在基本型別上呼叫方法,極大地增強了 JavaScript 的靈活性和功能性。然而,在使用時,我們也需要注意它的一些特性和潛在問題。
面試題
- 有可能會是面試題,先看以下程式碼:
var a = new Boolean(false);
if (!a) {
console.log('run?'); // 會進到 if 條件裡面嗎?
}
看了上面關於包裝型別的介紹,那會執行到 if 裡面嗎?
- 不會
- 為什麼呢?
// 個人的解析過程:
1. var a = new Boolean(false); 之後,a 的值為 [Boolean: false]
2. 將 a 轉換為包裝型別,執行 Object(a) 後值為 [Boolean: false]
3. 因為在 if 語句中的判斷條件都會轉換為 boolean 再進行判斷,那再進行 boolean 值的轉換, !!Object(a) 後值為 true
4. 而在 if 語句中的條件是取反 a,則 if 條件不成立,則 if 中的語句不執行
原因:
- 在 JavaScript 中,有兩種型別的布林值:基本型別的布林值
(true 或 false)
和Boolean
物件(透過new Boolean()
建立的,它是一個包裝物件,可以包裝一個布林值,但它本身是一個物件)。 - 在 JavaScript 中,所有的物件(包括
Boolean
物件)在布林上下文中都被視為true
,無論它們包裝的值是true
還是false
。 - 這就是為什麼 if 語句中的
!a
不會執行的原因,因為a
是一個Boolean
物件,即使它包裝的值是false
,在布林上下文中也被視為true
,所以!a
的結果是false
。
- 在 JavaScript 中,有兩種型別的布林值:基本型別的布林值