JavaScript學習筆記 - 原生函式

MADAO是不會開花的發表於2018-09-29

在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'

複製程式碼

JavaScript學習筆記 - 原生函式

通過new String('xxx')建立的是字串'xxx'的“封裝物件”,而不是基本型別值'xxx'。

  • [[class]]

    typeof 返回的值為'object'的物件,都有一個內部屬性[[class]],這個屬性可以通過Object.prototype.toString()獲得:

JavaScript學習筆記 - 原生函式

前面說到typeof 返回的值為'object'的物件內部才有[[class]]屬性,那麼這些基本型別的[[class]]屬性是哪裡來的呢?

這些基本型別的值JavaScript會自動的為它們包裝一個分裝物件。基本型別的值是沒有.lengthtoString()這些方法的,需要通過它們的封裝物件才能訪問,也就是說當你這樣用的時候:

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"
複製程式碼

相關文章