有時你可能須要對變量進行類型檢查,或者判斷變量是否已定義。有兩種方法可使用:typeof函數與constructor屬性。程序員
typeof函數的用法可能不用我多說,你們都知道怎麼用。而constructor屬性你們可能就陌生點。在《精通JavaScript》這本書中有提到construct的用法,但我用本身的幾個瀏覽器(IE7.0 / Firefox1.9 / Opera9.50)測試的結果卻和書上說的不同。可是仍然是有辦法經過constructor屬性來檢查變量類型的。正則表達式
這裏先補充一下,爲何明明有typeof函數能夠很方便地用來檢測類型,還要用constructor呢?數組
由於typeof會把全部的數組類型以及用戶自定義類型判斷爲object,從而沒法知道更確切的信息。而constructor卻能夠解決這個問題。瀏覽器
ok,明白了咱們爲何要用constructor,如今讓我帶你們一步步認識一下typeof和constructor用法之間的差別吧~函數
首先咱們運行一下下面這段代碼:測試
var i; alert(typeof(i)); alert(i.constructor);
這3行代碼告訴你什麼狀況下能夠用constructor。code
你能夠看到第2行返回了字符串'undefined',而第三行則發生了錯誤,緣由是i變量尚未類型定義,天然也沒有constructor的存在。ip
從這一點上看,typeof能夠檢查到變量是否有定義,而construct只能檢查已定義變量的類型。字符串
再運行一下下面這段代碼:原型
var i = 2; alert(typeof(i)); alert(i.constructor); alert(typeof(i.constructor));
你會看到第2行返回了字符串'number’,第3行返回了一串相似函數定義的代碼字符串(這就是跟《精通JavaScript》一書中介紹的不同的地方)。
咱們再用typeof檢查一下constructor究竟是個什麼樣類型的屬性,第4行返回結果'function',也就是說,實際上constructor是一個函數,更確切地說是一個構造函數。這時你就能夠知道,爲何constructor能夠檢查出各類類型了。
有經驗的程序員看到這裏應該知道要怎麼利用constructor來檢查變量類型了。方法有多種,這裏提供一種比較容易理解的方法。
其實想法很簡單,就是把construcor轉化爲字符串,經過尋找匹配字符串(function名)來肯定是否指定類型。以下例子:
function user() {}; var i = new user(); alert((i.constructor+'').match(/user/) == null);
這僅僅是個簡單的例子。若是返回true則變量i不是user類型,返回false則變量是user類型。
固然,這樣檢測是不夠精確的,好比其實他是一個myuser類型的時候,一樣會被認爲是user類。因此你須要書寫更精確的正則表達式去進行匹配。
能夠這樣簡單改進你的正則表達式: /function user()/
替換上面代碼段中的/user/。固然,若是你的構造函數原型是user(a),那麼應該這樣書寫你的正則表達式:
/function user\(a\)/
到這裏你應該知道怎樣使用constructor類型去檢查變量類型了吧?
ok,最後再提個醒,若是你要用基於constructor的方法去檢查一些基本類型,如
Object / Array / Function / String / Number / Boolean
在你的正則表達式中,必定要將這些單詞的首字母大寫!!而若是該類型是自定義類型,則根據你定義的時候標識符的寫法肯定。