J2EE學習筆記
          我們的失落……
          posts - 13,comments - 1,trackbacks - 0
          <2010年4月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          有時你可能需要對變量進行類型檢查,或者判斷變量是否已定義。有兩種方法可以使用: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。
          你可以看到第2行返回了字符串'undefined',而第三行則發生了錯誤,原因是i變量還沒有類型定義,自然也沒有constructor的存在。
          從這一點上看,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
          在你的正則表達式中,一定要將這些單詞的首字母大寫??!而如果該類型是自定義類型,則根據你定義的時候標識符的寫法確定。

          posted on 2010-04-14 14:30 J2EE學習筆記 閱讀(323) 評論(0)  編輯  收藏 所屬分類: 轉載 、javascript
          主站蜘蛛池模板: 弋阳县| 灵宝市| 恩平市| 南皮县| 巴彦淖尔市| 固始县| 广平县| 义马市| 台东市| 盘锦市| 永顺县| 从江县| 双柏县| 黎城县| 通辽市| 玉树县| 拜城县| 康乐县| 璧山县| 大邑县| 南江县| 隆安县| 宁陵县| 鄂托克旗| 开化县| 收藏| 克拉玛依市| 曲周县| 奇台县| 滕州市| 新源县| 壤塘县| 廊坊市| 商水县| 日喀则市| 宁波市| 苍梧县| 华亭县| 杭州市| 梨树县| 武平县|