原始值包裝類型 (特殊引用類型)
在ES6 時,ECMAScript 數據類型是這樣去分類的:
-
原始值(基本數據類型)
- Number
- String
- Boolean
- Undefined
- Null
- Symbol
-
引用值(複雜數據類型)
-
Object
函數也是一種引用類型
-
且我們知道,通常情況下,只有對象纔有方法。但是我們知道,實際上,字符串有字符串方法,如:
indexOf()
,lastIndexOf()
search()
slice()
,substring()
,substr()
replace()
toUpperCase()
,toLowerCase()
concat()
trim()
- 等等...
Number 有Number 方法,如:
toExponential()
toFixed()
toPrecision()
- 等等...
Boolean 有 Boolean 方法,如:
toString()
valueOf()
這些都是基本的數據類型, 但是卻有着對象的方法。
實際上,ECMAScript 爲了方便的操作原始值,提供了3中 特殊的引用類型 :
- Boolean
- Number
- String
let s1 = "some text";
let s2 = s1.substring(2);
這裏,第二行在訪問s1
的時候,是以讀模式訪問的。 也就是要從內存中讀取變量保存的值, 以讀模式訪問字符串值的任何時候,後臺都會執行以下3個步驟:
- 創建一個String類型的實例;
- 調用實例上的特定方法;
- 銷燬實例。
let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;
布爾值和數值也是一樣的, 以上3步也會在後臺發生,不過使用的是Boolean 和 Number 包裝類型而已 。
這三種特殊的引用類型,也叫做原始值包裝類型。
原始值包裝類型和應用類型的區別
引用類型與原始包裝類型的主要區別在於對象的生命週期。 在通過new
實例化引用類型後。 得到的實例會在離開作用域時被銷燬,而自創建的原始值包裝對象則只存在於訪問它的那行代碼執行期間。 這也爲之不能在運行時給原始值添加屬性和方法。
let s1 = "some text";
s1.color = "red"; // 創建臨時String 對象,並在執行完該行後立即被銷燬。
console.log(s1.color);// undefined
不過如果真的期望達到給一個原始值添加屬性。 可以顯式的去調用
new Boolean()
、new Number()
、new String()
這些構造函數以創建原始值包裝對象。有幾點值得注意:
不推薦使用, 因爲會讓開發者容易疑惑。
在原始值包裝類型的實例上使用
typeof
會返回 "object"let objNumb = new Number(100); let objStr = new String("some text"); let objBool = new Boolean(true); typeof objNumb; //'object' typeof objStr; //'object' typeof objBool; //'object'
通過原始值包裝類型構造函數顯式的實例化對象 都是 對應原始值包裝類型的實例
objNumb instanceof Number; // true objStr instanceof String; // true objBool instanceof Boolean; // true
通過工廠方法
Object
構造函數,也能夠根據傳入值的類型返回相應原始值包裝類型的實例let Ostr = new Object("some text"); let Onum = new Object(100); let Obool = new Object(false); Ostr instanceof String; // true Onum instanceof Number; // true Obool instanceof Boolean; // true