引用型別中的基本包裝型別
對於str.substring(2)這種方法我們經常使用,
var str = “hello world”;
var s1 = str.substring(2);
可是str明明是個字串(基本型別),又不是物件,為什麼可以呼叫方法呢。。。。
解釋說明:
當我們用str這個字串呼叫方法時,後臺已經為我們做了一系列操作,讓我們來看看究竟都做了哪些操作呢
當第二行程式碼訪問str時,訪問過程處於一種讀取模式(即從記憶體中讀取這個字串的值),而在讀取模式下訪問字串時,後臺會做如下處理
a.建立String型別的一個例項
b.在例項上呼叫指定的方法
c.銷燬這個例項
針對此處程式碼,可以想象是後臺進行了如下處理
var str = new String(“hello world”);
var s1 = str.substring(2);
str = null;
到此就解釋了為什麼字串這個基本型別可以呼叫方法了。
———————————————分割線——————————————————
接下來我們瞭解下基本包裝型別,即用到的new String(“hello world”)
為了便於操作基本型別,ECMAScript提供了三個特殊的引用型別:Boolean、Number和String。
實際上,每當讀取一個基本型別的值時,後臺就會建立一個對應的基本包裝型別的物件,就如上面的例子所示。
引用型別和基本包裝型別的區別
主要是物件生存週期的不同
a.使用new建立的引用型別的例項,在執行流離開當前作用域之前都一直儲存在記憶體中,
b.自動建立的包裝型別的物件只存在於一行程式碼的執行瞬間,然後被立即銷燬
舉個例子
var str = “hello world”;
str.color = “red”;
alert(str.color); //undefined
第二行程式碼建立的String物件在執行第三行程式碼時已經被銷燬,第三行程式碼又建立了自己的String物件,而該物件沒有color屬性。
當然可以顯示的呼叫String、Boolean和Number來建立基本包裝型別的物件,但是再不是絕對必要的情況下不建議使用,這樣很容易讓人分不清楚是在處理基本型別還是引用型別的值。
Object建構函式也會像工廠方法一樣,根據傳入值的基本型別返回相應基本包裝型別的例項。例如
var obj = new Object(“hello world”);
alert(obj instanceof String ) ; //true
需要注意的是:
使用new 呼叫基本包裝型別的建構函式,與直接呼叫同名的轉型函式是不一樣的
var value = “25”;
var number = Number(value); //轉型函式
alert(typeof number); // “number”
var obj = new Number(value);
alert( typeof obj ); // “object”
此處number中儲存的是基本型別的值25
obj中儲存的是Number的例項
——參考《javascript 高階程式設計》第五章的第六節的基本包裝型別