JS的原生函數

經常使用的原生函數有:javascript

  • String()
  • Number()
  • Boolean()
  • Array()
  • Object()
  • Function()
  • RegExp()
  • Date()
  • Error()
  • Symbol()

1.內部屬性

全部typeof返回值爲"object"的對象都包含一個內部屬性[[Class]],這個屬性沒法直接訪問,通常經過Object.prototype.toString(..)來查看。java

Object.prototype.toString.call(null);//"[object Null]"
Object.prototype.toString.call(undefined);//"[object Undefined]"

雖然Null()和Undefined()這樣的原生構造函數並不存在,可是內部[[Class]]屬性值仍然是"Null "和"Undefined "。數組

Object.prototype.toString.call("abc");//"[object String]"
Object.prototype.toString.call(42);//"[object Number]"
Object.prototype.toString.call(true);//"[object Boolean]"

基本類型值被各自的封裝對象自動包裝。app

2.封裝對象包裝

因爲基本類型值沒有.length.toString()這樣的屬性和方法,須要經過封裝對象才能訪問,此時JavaScript會自動爲基本類型值包裝一個封裝對象。函數

var a = "abc";

a.length;//3
a.toUpperCase();//"ABC"

通常狀況下,咱們不須要直接使用封裝對象,最好的辦法是讓JavaScript引擎本身決定何時使用封裝對象。
若是想要自行封裝基本類型值,可使用Object(..)函數。prototype

var a = "abc";
var b = new String(a);
var c = Object(a);

typeof a;//"string"
typeof b;//"object"
typeof c;//"object"

b instanceof String;//true
c instanceof String;//true

Object.prototype.toString.call(b);//"[object String]"
Object.prototype.toString.call(c);//"[object String]"

3.拆封

若是想要獲得封裝對象中的基本類型值,可使用valueOf()函數:調試

var a = new String("abc");
var b = new Number(42);
var c = new Boolean(true);

a.valueOf();//"abc"
b.valueOf();//42
c.valueOf();//true

在須要用到封裝對象中的基本類型值的地方會發生隱式拆封。code

var a = new String("abc");
var b = a + "";//b的值爲"abc"

typeof a;//"object"
typeof b;//"string"

4.原生函數做爲構造函數

4.1 Array()

var a = new Array(1,2,3);
console.log(a);//[1,2,3]
var b = [1,2,3];
console.log(b);//[1,2,3]

Array構造函數只帶一個數字參數的時候,該參數會被做爲數組的預設長度,而非只充當數組中的一個元素。regexp

var a = new Array(3);
console.log(a.length);//3
console.log(a);//[]

4.2 Object()、Function()和RegExp()

除非萬不得已,不然儘可能不要使用Object(..)/Function(..)/RegExp(..)對象

4.3 Date()和Error()

建立日期對象必須使用new Date()Date(..)能夠帶參數,用來指定日期和時間,而不帶參數的話則使用當前的日期和時間。
Date(..)主要用來得到當前的Unix時間戳,該值能夠經過日期對象中的getTime()來得到。
從ES5開始引入了一個更簡單的方法,即靜態函數Data.now()

構造函數Error(..)帶不帶new關鍵字均可。
建立錯誤對象主要是爲了得到當前運行棧的上下文。棧上下文信息包括函數調用棧信息和產生錯誤的代碼行號,以便於調試。

針對特定錯誤類型的原生構造函數不多被直接使用,它們在程序發生異常時會被自動調用。

4.4 Symbol()

ES6新加入了一個基本數據類型——符號。符號是具備惟一性的特殊值 ,用它來命名對象屬性不容易致使重名。
咱們可使用Symbol(..)原生構造函數來自定義符號。但它比較特殊,不能帶new關鍵字,不然會報錯。

var mysym = Symbol("my own symbol");
console.log(mysym);//Symbol(my own symbol)
console.log(mysym.toString());//"Symbol(my own symbol)"
console.log(typeof mysym);//"symbol"

4.5 原生原型

原生構造函數有本身的.prototype對象,這些對象包含其對應子類型所特有的行爲特徵。
例如,將字符串值封裝爲字符串對象以後,就能訪問String.prototype中定義的方法。
全部的函數均可以調用Function.prototype中的apply(..)call(..)bind(..)

參考:《你不知道的JavaScript》(中卷)
相關閱讀:

相關文章
相關標籤/搜索