在JavaScript中有一些原生函式,有時候也叫內建函式,常見的有:
- String()
- Number()
- Object()
- Boolean()
- Array()
- Function()
- RegExp()
- Date()
- Error()
- Symbol()
這些函式都可以被當做建構函式來使用,比如:
let str = 'abc';
let str1 = new String('efg');
它們的區別是:
typeof str // 'string'
typeof str1 // 'object'
複製程式碼
通過new String('xxx')建立的是字串'xxx'的“封裝物件”,而不是基本型別值'xxx'。
-
[[class]]
typeof 返回的值為'object'的物件,都有一個內部屬性[[class]],這個屬性可以通過Object.prototype.toString()獲得:
前面說到typeof 返回的值為'object'的物件內部才有[[class]]屬性,那麼這些基本型別的[[class]]屬性是哪裡來的呢?
這些基本型別的值JavaScript會自動的為它們包裝一個分裝物件。基本型別的值是沒有.length
、toString()
這些方法的,需要通過它們的封裝物件才能訪問,也就是說當你這樣用的時候:
let str = 'abc';
str.length; // 3
str.toString(); // 'abc'
複製程式碼
JavaScript會自動的為基本型別包裝一個封裝物件,所以一般情況下不需要使用封裝物件(let str = new String('123')),讓JavaScript引擎自己決定什麼時候用封裝物件即可。而且使用封裝物件還有些隱蔽的小陷阱:
let bool = new Boolean(false);
if(!bool) {
console.log('here');
}
這個if語句中的console.log是不會執行的的,
因為使用new Boolean為false建立了一個封裝物件,而物件轉換成布林值總是true
let arr = new Array(3);
arr.length; // 3
arr // [empty × 3]
當通過 new Array建立一個陣列的時候只有一個數字引數的時候,這個引數就會成為
陣列的長度
複製程式碼
所以,除非真的需要,不建議使用封裝物件。
如果想獲取封裝物件中的基本型別的值,可以通過 valueOf()函式:
let str = new String('abc');
str.valueOf(); // "abc"
複製程式碼