帶你走進JavaScript世界系列——基本包裝類型

為了便於操作基本類型值,ECMAScript 提供了3個特殊的引用類型:Boolean,Number和String。這些類型與其他引用類型相似,但同時也具有各自的基本類型相應的特殊行為。實際上,每當讀取一個基本類型值的時候,後臺就會創建一個對應的基本包裝類型的對象。請看下面的例子:

帶你走進JavaScript世界系列——基本包裝類型

這個例子中的s1變量包含了一個基本類型的字符串,第二行調用了s1的substring()方法。熟悉面對對象編程語言的人都知道,基本類型值不是對象,從邏輯上講它不應該有方法。其實,為了讓我們實現這種直觀的操作,後臺已經自動完成了一些列的處理。當第二行代碼訪問s1的時候,訪問過程處於一種讀取模式,也就是從內存中讀取這個字符串的值。在讀取模式中訪問字符串時,後臺都會自動完成下列處理:

  1. 創建String類型的實例;
  2. 在實例上調用指定的方法;
  3. 銷燬這個實例。

經過此番處理,基本的字符串值就變得跟對象一樣了。而且,上面這個三個步驟也分別適用於Boolean和Number類型對應的布爾值和數字值。

引用類型與基本包裝類型的主要區別就是對象的生命週期。使用new操作符創建的引用類型的實例,在執行離開當前作用域之前都一直保存在內存中。而自動創建的基本包裝類型的對象,則只存在於一行代碼的執行瞬間,然後立即銷燬。這意味著我們不能在運行時為基本類型值添加熟悉和方法。

請看下面例子:

帶你走進JavaScript世界系列——基本包裝類型

基本類型添加屬性例子

Boolean類型

Boolean類型是與布爾值對應的引用類型。要創建Boolean對象,可以通過調用Boolean構造函數並傳入true或false值。

Boolean類型的實例重寫了valueOf()方法,返回基本類型值true或false;重寫了toString()方法,返回字符串"true"和"false"。Boolean對象在ECMAScript中的用處不大,它經常使人造成誤解。最常見的問題就是在布爾表達式中使用Boolean對象,例如:

帶你走進JavaScript世界系列——基本包裝類型

Boolean對象使用過程中的坑

上面這個例子中,我們使用false值創建了一個Boolean對象,然後用它與基本類型值true進行邏輯與運算。我們都知道,false && true 是等於false。可是結果卻是true。這是因為是對falseObject而不是對它的值(false)進行求值。前面我們說過,在布爾表達式中的所有對象都會被轉成true,因此falseObject 對象在布爾表達式中代表true。

建議永遠不要使用Boolean對象。

Number類型

Number是與數字值對應的引用類型,要創建Number對象,可以在調用Number構造函數時傳入相應的數值。

Number類型重寫了valueOf(),toLocaleString()和toString()方法。valueOf()方法返回對象表示的基本類型的數值。另外兩個方法返回對應字符串形式的數值。之前的文章裡面還介紹過,可以在toString()方法中傳遞一個表示基數的參數,告訴它返回幾進制數值的字符,這裡不再過多介紹了。

除了繼承的方法之外,Number類型還提供了一些用於將數值格式化為字符串的方法。

  1. toFixed():按照指定的小數位返回數值的字符串
  2. toExponential():返回以指數形式表示的數值的字符串
  3. toPrecision():可能返回固定大小格式,也可能返回指數格式,具體規則是看哪種格式最合適
帶你走進JavaScript世界系列——基本包裝類型

Number類型方法示例

String類型

String類型是字符串的對象包裝類,可以使用String構造函數來創建。

String對象的方法可以在所有基本的字符串值中訪問到。其中繼承的valueOf(),toLocaleString()和toString()方法,都返回對象所表示的基本字符串值。

String類型的每個實例都有一個length 屬性,表示字符串中包含多少個字符。

帶你走進JavaScript世界系列——基本包裝類型

String length屬性

String類型提供了很多方法,用於輔助ECMAScript中字符串的解析和操作。

  1. charAt():以單字符字符串的形式返回指定位置的那個字符(另外,可以使用方括號加數字索引來訪問字符串中的字符);
  2. charCodeAt():返回指定位置字符的字符編碼;
  3. concat():用於將一個或多個字符串拼接,返回拼接後的新字符串,原字符串不變(大多情況下可以使用+號來拼接);
  4. slice():返回被操作字符串的子串,第一個參數表示子串開始位置,第二個參數表示子串的結束位置;
  5. substring():大多情況下同slice(),只有傳入負數是會有區別;
  6. substr():傳入一個參數時同slice(),傳入第二個參數時,第二個參數表示要返回的字符個數;
  7. indexOf():從字符串開頭向後搜索子串,返回子串的位置;
  8. lastIndexOf():從字符串的末尾向前搜索子串,返回子串的位置;
  9. trim():去字符串前後空格,原字符串不變;
  10. toUpperCase()/toLowerCase():字符串大小寫轉換
  11. match():返回一個數組,數組第一項是與整個模式匹配的字符串,之後的每一項保存與正則表達式中的捕獲組匹配的字符串
  12. search():返回字符串中第一個匹配項的索引
  13. replace():替換字符串中的內容;
  14. split():將字符串按指定的字符分割成數組;
帶你走進JavaScript世界系列——基本包裝類型

charAt() 和 charCodeAt()

帶你走進JavaScript世界系列——基本包裝類型

concat()方法

帶你走進JavaScript世界系列——基本包裝類型

slice,substring和substr正數情況

帶你走進JavaScript世界系列——基本包裝類型

slice,substring和substr負數情況

帶你走進JavaScript世界系列——基本包裝類型

indexOf和lastIndexOf()

帶你走進JavaScript世界系列——基本包裝類型

trim()方法

帶你走進JavaScript世界系列——基本包裝類型

match,search和replace

帶你走進JavaScript世界系列——基本包裝類型

split()方法


分享到:


相關文章: