包裝對象是爲了彌補基本數據類型的非對象特性而產生的,對於基本類型值而言,原本是不存在屬性和方法的,可是咱們能夠在使用字面量建立字符串時,調用例如"hello".concat(" world")
的方法,那麼其內在原理到底是什麼呢?
閱讀完本篇文章,相信你能找到答案。javascript
包裝對象指的是數據類型爲Number
、String
和Boolean
的值對應的原生對象;
三大包裝對象能力在於:html
可以將上述基本類型值包裝成真正的對象,從而體現JavaScript語言一切皆對象的特色;java
是字面量使用對應包裝對象的方法的內在原理;數組
是進行數據類型轉換的利器;函數
基本數據類型咱們能夠直接採用字面量的形式建立:工具
var num = 1,str = "hello",bool = true;
也能夠採用對應包裝對象的形式建立:spa
var num = new Number(1),str = new String("hello"),bool = new Boolean(true)
兩者區別在於前者是基本數據類型,後者是屬於對象的引用數據類型;設計
兩者的聯繫在於:3d
經過對象的valueOf()方法能夠獲取其基本類型值;
code
字面量可直接調用包裝對象的實例的方法;
其原理在於每次基本類型字面量在調用包裝對象實例的方法時,首先建立對於包裝對象的實例,而後在實例上調用該方法,最後銷燬該實例,即
var str = "hello world"; str.split(" ") 等價於 var str = new String("hello world") str.split(" ") str = null;
因此,每當爲字面量賦屬性值時是無效的,由於每次字面量調用完包裝對象實例的方法後都會銷燬實例;
關於更多包裝對象的實例屬性和方法詳見下文;
在《JavaScript標準庫系列——Object對象和Array對象(一)》一文中,小羊曾提到Object是其餘一切對象的構造函數,因此三大包裝對象的實例均可以由Object來構造;
var num = new Object(1);等價於 new Number(1) var str = new Object('hello');new String('hello') var bool = new Object(true);new Booleab(true)
Object構造函數根據傳入參數的數據類型返回相應的基本包裝類型的實例;
包裝對象直接做爲工具方法實現到不一樣類型數據之間的類型轉換做用,詳見《JavaScript數據類型(四)》一文;
繼承自Object對象的valeOf()和toString()方法
這兩個方法繼承自Object對象,常常在使用字面量與其餘類型數據進行運算時調用,例如:
這裏順帶講一下+
運算符的原理:
先自動轉成原始類型的值(即先執行該對象的valueOf
方法,若是結果還不是原始類型的值,再執行toString
方法;若是對象是Date實例,則先執行toString
方法);
兩個運算子都是原始類型的值之後,只要有一個運算子是字符串,則兩個運算子都轉爲字符串,執行字符串鏈接運算;
不然,兩個運算子都轉爲數值,執行加法運算;
來自阮一峯《JavaScript 標準參考教程》;
以1+str
、1+obj
和1+bool
爲例:1+str
加法運算符兩側的運算子包含字符串,採用字符串拼接方法;1+obj
加法運算符兩側的運算子包含對象,先採用valueOf()方法,發現仍是對象,在調用toString()方法獲得"[object Object]"
,而後進行字符串拼接;1+bool
發現其中一個運算子是布爾值直接使用Number()進行包裝;
源自包裝對象實例的方法
三大包裝對象中String對象的實例方法相對來講比較重要,這裏重點講一下,其餘兩個能夠參考阮一峯的教程;
字符方法
charAt():返回指定位置的字符;
charCodeAt():返回給定位置字符的Unicode碼
類數組方法
length:返回字符串的長度;
concat:合併字符串,返回新字符串,不改變原字符串;
slice:提取字符串,第一個參數是子字符串的開始位置,第二個參數是子字符串的結束位置(不含該位置),返回子字符串,不改變原字符串;
substr:提取字符串,第一個參數是子字符串的開始位置,第二個參數是子字符串的長度,返回子字符串,不改變原字符串;
格式化方法
toUpperCase:將字符串變大寫
toLowerCase:將字符串變小寫
trim:去除字符串先後的空格
檢索相關方法
match:傳入一個參數,若原字符串匹配參數則返回匹配的符串數組;
replace:可傳兩個參數,第一個爲檢索表達式,第二個爲替換值;
更多詳見《JavaScript標準庫系列——RegExp對象(三)》
var str = "hello world" str.split(" ").map(function(ele){ return ele.replace(/^\w/,function(match){ return match.toUpperCase() }) }).join(" ") //"Hello World"
split()方法
split:按照給定的參數去分割字符串,和數組的join是互爲逆方法;
經過全文的瀏覽,咱們瞭解到:
包裝對象是三大原始類型數據Number、String和Boolean對於的原生對象;
三大包裝對象在JavaScript中的做用主要是能將三大基本數據類型也包裝成對象,從而體現JavaScript一切皆對象的特性;是字面量調用對應實例方法的內在原理;是進行數據類型轉換的利器;
經過new+包裝對象方法可以建立不一樣的包裝對象實例,調用其valueOf()方法就能夠獲得對應的原始類型值;同時也能夠經過Object對象去構造對應的包裝對象;
包裝對象的使用既能夠做爲工具方法,起到數據類型轉換做用;又能夠建立實例,從而實例能夠調用部署在對應包裝對象原型上的方法;
valueOf()和toString()是三大包裝對象實例的共有方法,在進行數據類型轉換時會派上用場;
本文主要講解了關於String包裝對實例的方法,包括字符方法、類數組方法、格式化方法、檢索方法和split方法;
《JavaScript高級程序設計(第3版)》