為了方便操作基本型別值,ECMAScript也提供了3個特殊的參考型別:Boolean、Number和String。這些類型與本章介紹的其他引用類型相似,但同時也具有與各自的基本類型相應的特殊行為。實際上,每當讀取一個基本類型值得時候,後台就會建立一個對應的基本包裝類型的對象,讓我們能夠呼叫一些方法來操作這些資料。如下例:
這個範例中的變數s1包含一個字串,字串當然是基本型別值,而下一行程式碼呼叫了s1的substring()方法,並將傳回的結果保存在了s2中。我們知道,基本類型值不是對象,因而從邏輯上講它們不應該有方法(儘管如我們所願,它們確實有方法)。其實,為了讓我們實現這種直覺的操作,後台已經自動完成了一系列的處理。當第二行程式碼存取s1時,存取過程處於一種讀取模式,也就是呀從記憶體中讀取這個字串的值。而在讀取模式中存取字串時,後台會自動完成下列處理。
1.建立String類型的一個實例;
2.在實例上呼叫指定的方法;
3.銷毀這個實例。
可以將以上三個步驟想像成是執行了下列ECMAScript程式碼。
經過此番處理,基本的字串值就變得跟物件一樣了,而且,上面這三個步驟也分別適用於Boolean和Number型別對應的布林值和數字值。
引用型別與基本包裝型別的主要差異就是物件的生存期。使用new運算元建立的參考類型的實例,在執行流離開目前作用域之前都一直保存在記憶體中。而自動建立的基本包裝類型的對象,則只存在於一行程式碼的執行瞬間,然後立即被銷毀。這意味著我們不能再運行時為基本類型值新增屬性和方法。如下面範例:
在此,第二行程式碼試圖為字串s1新增一個color屬性。但是,當第三行程式碼在此存取s1時,其color屬性不見了。問題的原因就是第二行建立的String物件在執行第三行程式碼時已經被銷毀了。第三行程式碼又建立自己的String對象,而物件沒有color屬性。
當然,可以顯示的滴調用Boolean、Number和String來建立基本包裝類型的物件。不過,應該在絕對必要的情況下再這樣做,因為這種做法很容易讓人分不清自己是在處理基本包裝類型還是引用基本包裝類型的值。對基本包裝類型的實例呼叫typeof會傳回“object”,而且所有基本包裝類型的物件都會轉換為布林值true。
Object建構子也會像工廠方法一樣,根據傳入值得型別傳回對應基本包裝型別的實例。例如:
把字串傳給Object建構函數,就會建立String的實例;而傳入數值參數會得到Number的實例,傳入布林值參數就會得到Boolean的實例。
要注意的是,使用new呼叫基本包裝類型的建構函數,與直接呼叫同名的轉型函數是不一樣的。例如:
この例では、変数numberには基本型の値25が格納され、変数objにはNumberのインスタンスが格納されます。
基本的なラッパー型のオブジェクトを明示的に作成することはお勧めしませんが、基本的な型の値を操作する機能は依然として非常に重要です。それぞれの基本的なラッパー タイプは、対応する値を操作するための便利なメソッドを提供します。
この記事の内容は以上です。皆さんに気に入っていただければ幸いです。