原始值包裝型別 (特殊引用型別)
在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