JavaScript中的包裝型別詳解

發表於2024-02-26

JavaScript中的包裝型別詳解

  • 在 JavaScript 中,我們有基本型別和物件型別兩種資料型別。
  • 基本型別包括 StringNumberBooleannullundefinedSymbol。然而,當我們需要在這些基本型別上呼叫方法時,就需要用到 JavaScript 的包裝型別。

什麼是包裝型別?

  • 包裝型別是 JavaScript 中的一種特殊物件,它們將基本型別的值“包裝”在物件中,使我們能夠在基本型別上呼叫方法。JavaScript 提供了三種包裝型別:StringNumberBoolean
  • 例如,當我們在一個字串上呼叫方法時,JavaScript 會臨時將其轉換(或者說“包裝”)為一個物件,這樣就可以呼叫方法了。
var str = 'hello';
console.log(str.toUpperCase()); // 輸出 "HELLO"
  • 在這個例子中,str 是一個字串基本型別,但我們可以在它上面呼叫 toUpperCase 方法。這是因為 JavaScript 在後臺臨時將 str 包裝成了一個 String 物件,然後在這個物件上呼叫了 toUpperCase 方法。

包裝型別的特性

  • 值得注意的是,這種包裝只是臨時的,呼叫方法後,基本型別值會恢復到原來的狀態。這就是所謂的包裝型別。
  • 此外,雖然 nullundefined 也是基本型別,但它們沒有對應的包裝型別,也沒有可以呼叫的方法。

包裝型別的注意事項

  • 雖然包裝型別在 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 中的語句不執行
  • 原因:

    1. 在 JavaScript 中,有兩種型別的布林值:基本型別的布林值(true 或 false)Boolean 物件(透過 new Boolean() 建立的,它是一個包裝物件,可以包裝一個布林值,但它本身是一個物件)。
    2. 在 JavaScript 中,所有的物件(包括 Boolean 物件)在布林上下文中都被視為 true,無論它們包裝的值是 true 還是 false
    3. 這就是為什麼 if 語句中的 !a 不會執行的原因,因為 a 是一個 Boolean 物件,即使它包裝的值是 false,在布林上下文中也被視為 true,所以 !a 的結果是 false

相關文章