為什麼基本型別可以呼叫方法——以字串為例

魚愛水發表於2018-06-12

引用型別中的基本包裝型別

對於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 高階程式設計》第五章的第六節的基本包裝型別

 

相關文章