經常使用的原生函數有:javascript
全部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
因爲基本類型值沒有.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]"
若是想要獲得封裝對象中的基本類型值,可使用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"
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);//[]
除非萬不得已,不然儘可能不要使用Object(..)
/Function(..)
/RegExp(..)
。對象
建立日期對象必須使用new Date()
。Date(..)
能夠帶參數,用來指定日期和時間,而不帶參數的話則使用當前的日期和時間。
Date(..)
主要用來得到當前的Unix時間戳,該值能夠經過日期對象中的getTime()
來得到。
從ES5開始引入了一個更簡單的方法,即靜態函數Data.now()
。
構造函數Error(..)帶不帶new關鍵字均可。
建立錯誤對象主要是爲了得到當前運行棧的上下文。棧上下文信息包括函數調用棧信息和產生錯誤的代碼行號,以便於調試。
針對特定錯誤類型的原生構造函數不多被直接使用,它們在程序發生異常時會被自動調用。
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"
原生構造函數有本身的.prototype
對象,這些對象包含其對應子類型所特有的行爲特徵。
例如,將字符串值封裝爲字符串對象以後,就能訪問String.prototype
中定義的方法。
全部的函數均可以調用Function.prototype
中的apply(..)
、call(..)
和bind(..)
。
參考:《你不知道的JavaScript》(中卷)
相關閱讀: