1. 程式人生 > >JS中的基本包裝型別是怎麼回事

JS中的基本包裝型別是怎麼回事

       為了便於操作基本型別值,ECMAScript 還提供了 3 個特殊的引用型別:

Boolean、Number 、String

這些型別與本章介紹的其他引用型別相似,但同時也具有與各自的基本型別相應的特殊行為。 

每當讀取一個基本型別值的時候,後臺就會建立一個對應的基本包裝型別的物件,從而讓我們能夠呼叫一些方法來操作這些資料。

var s1 = "some text";
var s2 = s1.substring(2); 

這個例子中的變數 s1 包含一個字串,字串當然是基本型別值。而下一行呼叫了 s1 的 substring()方法,並將返回的結果儲存在了 s2 中。我們知道,基本型別值不是物件,因而從邏輯上 講它們不應該有方法(儘管如我們所願,它們確實有方法)。其實,為了讓我們實現這種直觀的操作, 後臺已經自動完成了一系列的處理。當第二行程式碼訪問

s1 時,訪問過程處於一種讀取模式,也就是要 從記憶體中讀取這個字串的值。而在讀取模式中訪問字串時,後臺都會自動完成下列處理。 

(1) 建立 String 型別的一個例項; 

(2) 在例項上呼叫指定的方法; 

(3) 銷燬這個例項。

可以將以上三個步驟想象成是執行了下列 ECMAScript程式碼。 

var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null; 

引用型別與基本包裝型別的主要區別就是物件的生存期。使用 new 操作符建立的引用型別的例項, 在執行流離開當前作用域之前都一直儲存在記憶體中。而自動建立的基本包裝型別的物件,則只存在於一 行程式碼的執行瞬間

,然後立即被銷燬。這意味著我們不能在執行時為基本型別值新增屬性和方法。



當然,可以顯式地呼叫 Boolean、Number 和 String 來建立基本包裝型別的物件。不過,應該在 絕對必要的情況下再這樣做,因為這種做法很容易讓人分不清自己是在處理基本型別還是引用型別的 值。對基本包裝型別的例項呼叫 typeof 會返回"object",而且所有基本包裝型別的物件都會被轉換 為布林值 true。


摘錄自《JavaScript高階程式設計》第三版 Page118