爲了便於操作基本類型值,ES還提供了三種特殊的引用類型,即(基本包裝類型):Number,String,Boolean。這三種類型與前面介紹的引用類型相似,但同時也擁有基本數據類型的一些特性。
平時經常看到人家代碼裏創建了一個字符串/數字類型,然後使用字符串/數字類型的一些方法,比如,split()、substring()等等,搞得我們誤以爲基本包裝類型擁有的方法。其實,我們這種理解是錯誤的。實際上,當我們操作基本包裝類型數據時,在後臺就會悄悄的創建一個對應的基本包裝類型的對象。因爲是對象呀,所以我們才能夠調用對象所擁有的方法。
舉個例子:
var str = "hello,1024idea"; var strSub = str.substring(2,7); console.log(strSub);//llo,1
執行上面代碼,其實,在後臺會執行如下步驟:
創建基本包裝類型的對象實例
調用對象實例的函數
銷燬這個對象
如下所示:
var str = "hello,1024idea"; var strObj = new String(str); var strObjSub = strObj.substring(2,7); strObj.null; console.log(strObjSub);//llo,1
引用類型與基本包裝類型的區別:在於對象的生命週期。
使用new關鍵字創建的引用類型的實例,對象在當前作用域都存在。而基本包裝類型自動創建的對象則在對象被調用的時刻存在,調用完畢後,就被銷燬不存在了。
Object()構造函數,可以根據你傳入的參數的類型,返回基本包裝類型的實例。你傳入字符串,則返回String類型的實例;傳入數字,則返回Number類型的實例;傳入布爾值,則返回Boolean類型實例。如:
var obj = new Object("hello,1024idea"); console.log(obj instanceof String);// true
注意:使用new關鍵字創建的構造函數與使用同名的轉型函數的效果是不一樣的。如:
// 構造函數與轉型函數返回值的區別 var str = "1024"; var strObj = new String(str); console.log(typeof strObj);//object var strNum = Number(str); console.log(typeof strNum);//number
這個例子中,變量strObj保存的是object類型,而變量strNum保存的是number類型。
一般情況下,是不建議手動的去創建基本包裝類型的對象,因爲這樣經常造成的問題是,分不清自己是在處理基本包裝類型還是引用類型。
Boolean類型
Boolean類型是布爾值創建的引用類型。創建Boolean類型,可以使用Boolean構造函數去創建,並傳入true或者false參數。如:
var booleanObject = new Boolean(true);
注意:在布爾表達式中使用Boolean對象,我們可能會出錯的一些地方,如:
var booleanObj = new Boolean(false); var result = booleanObj && true; console.log(result);
你覺得上面會打印出什麼結果呢?大多數人可能會說是false,因爲一真一假嘛,所以爲false。但是,事實上結果是true,因爲booleanObj是一個對象,在布爾表達式中,所有的對象都會被轉換爲true。記住:引用類型的布爾值,其實是對象。
當然,我們不推薦這麼用(不推薦用引用類型的布爾值來判斷布爾表達式)
愛創課堂--專業前端技術培訓
年薪30萬不是夢
Number 類型
Number類型是數字值創建的引用類型。創建Number類型,使用Number類型的構造函數,可以傳遞數字值參數,如:
var numberObj = new Number(1024);
這裏介紹一個Number類型的一個方法:numberObj.toFixed();可以接受一個數值,表示保留的小數的個數(會自動四捨五入)。在平時項目中,我們經常要處理價格問題或者增長率問題,即保留多少爲小數,用這個方法非常有效。
// Number 類型 var numberObj = new Number(1024.153); console.log(numberObj.toFixed(2));//1024.15 console.log(numberObj.toFixed(1));//1024.2
String類型
String類型是字符串值創建的引用類型。
String類型創建的方式,使用String構造函數創建,可以傳入字符串參數;如:
var stringOjb = new String(“hello,1024idea”);
String類型的每個實例都有一個length屬性,用於計算字符串的長度(即字符串中包含多少個字符)。
字符方法:charAt(),charCodeAt(),接受一個數字參數,返回某個數字索引位置的字符或字符編碼。
在ES5還定義了另一個訪問字符串中某個字符的方法,在支持ES5的瀏覽器中,可以用方括號[]來訪問。
// String類型 var str = "hello,1024idea"; console.log(str.charAt(4));//o console.log(str.charCodeAt(4));//111 console.log(str[4]);//o
字符串的操作方法:concat(),可以將多個字符串連接起來。返回得到的新字符串。
var str1 = "hello,"; var str2 = str1.concat("1024idea"); console.log(str2);//hello,1024idea
其實,實踐中,我們平時用的多的還是用“+”去拼接字符串。
split() 將字符串用某個分隔符分割,返回數組。你也可以傳入一個參數,即“分隔符”。
slice(),substring(),substr().這三個是截取字符串的函數。其中,slice()跟substring()非常類似,第一個參數都是截取的起始位置,第二個參數是截取的終止位置;而substr()第一個參數是起始位置,第二個參數則是需要截取的長度。
這三個函數,都不改變原本的字符串,只是在原先的字符串上創建了一個副本。返回操作副本後的值。
字符串的位置方法:indexOf(),lastIndexOf();從索引0的位置開始查詢子字符串/從最後一個索引開始查找字符串。如果找到,則返回子字符串的位置,如果沒有找到,返回-1;第一個參數爲要查找的子字符串,第二個參數 可選的,如果有,則表示從某個位置開始查找。
ES5中還定義了trim()方法,去除字符串的開頭和結尾的所有空格。此外,對於firefox,safari,chrome的後面的一些版本中,還支持非標準的trimLeft()和trimRight()方法,用於刪除字符串的開頭空格或結尾空格。
字符串的大小寫轉換方法:toLowerCase(),toUpperCase();