JavaScript判斷變量類型:typeof函數與constructor屬性異同

有時你可能須要對變量進行類型檢查,或者判斷變量是否已定義。有兩種方法可使用: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

在你的正則表達式中,必定要將這些單詞的首字母大寫!!而若是該類型是自定義類型,則根據你定義的時候標識符的寫法肯定。

相關文章
相關標籤/搜索