日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

      首頁編程開發(fā)javascript|JQuery → javascript中如何做對象的類型判斷

      javascript中如何做對象的類型判斷

      相關軟件相關文章發(fā)表評論 來源:西西整理時間:2012/11/30 9:07:13字體大。A-A+

      作者:西西點擊:9次評論:0次標簽: 對象

      • 類型:瀏覽輔助大小:2KB語言:中文 評分:7.2
      • 標簽:
      立即下載

      對象僅僅是一種特殊的數(shù)據(jù)類型而已,并擁有一系列的屬性和方法。
      讓我們用一個例子來理解:一個人就是一個對象。屬性是和對象有關的值。人的屬性包括其名字、身高、體重、年紀、膚色、眼睛的顏色等等。所有的人都有這些屬性,但是每個人的屬性的值卻各不相同。對象也擁有方法。方法是可施加于對象上的行為。人的方法可能是吃、睡、工作、玩等等。

      JavaScript對象

      ECMA-262將對象(object)定義為"屬性的無序集合,每個屬性存放一個原始值、對象或函數(shù)"(unordered collection of properties each of which contains a primitive value, object, or function)。這意味著對象是無特定順序的值的數(shù)組。在ECMAScript中,對象由特性(Attribute)構成,特性可以是原始值,也可以是引用值。如果特性存放的是函數(shù),它將被看作對象的方法(Method),否則該特性被看作屬性(Property)。

      最近在翻看John Resig的大作《Pro JavaScript Techniques》,里面講到了如何做javascript的類型判斷的問題。文中介紹了兩種方式,一種是使用typeof,另一種是使用constructor。略感遺憾的是作為jquery的作者,他盡然沒有介紹jquery使用的類型判斷方式。不過沒有關系,我在這里給大家一起總結下。

      在這里我首先像大家推薦一個很好用的在線編輯器:http://jsfiddle.net/。他提供了jquery、mootools、prototype和YUI三個主流js框架的各個版本,當你需要編寫簡單的js測試程序的時候可以直接使用它。省去了打開編輯軟件,創(chuàng)建各種類型文件的步驟。編輯代碼之后,點擊[Run]按鈕,一切搞定。

      1.typeof

      typeof是我們在做類型判斷時最常用的方法,他的優(yōu)點就是簡單、好記,缺點是不能很好的判斷object、null、array、regexp和自定義對象。

      下面是我的測試代碼:

      var str='str';
      var arr=['1','2'];
      var num=1;
      var bool=true;
      var obj={name:'test'};
      var nullObj=null;
      var undefinedObj=undefined;
      var reg=/reg/;

      function fn(){
          alert('this is a function');
      }

      function User(name){
          this.name=name;
      }
      var user=new User('user');

      console.log(typeof str);
      console.log(typeof arr);
      console.log(typeof num);
      console.log(typeof bool);
      console.log(typeof obj);
      console.log(typeof nullObj);
      console.log(typeof undefinedObj);
      console.log(typeof reg);
      console.log(typeof fn);
      console.log(typeof user);
         
      代碼運行結果:

      2.constructor

      現(xiàn)在介紹一種不常使用的方法,對象構造器constructor。他的優(yōu)點是支持大部分對象類型的判斷,特別是對自定義對象的判斷;缺點是不能在null和undefined上使用。

      測試代碼和之前的差不多,區(qū)別就是使用XXX.constructor代替了typeof。

      var str='str';
      var arr=['1','2'];
      var num=1;
      var bool=true;
      var obj={name:'test'};
      var nullObj=null;
      var undefinedObj=undefined;
      var reg=/reg/;
      function fn(){
          alert('this is a function');
      }
      function User(name){
          this.name=name;
      }
      var user=new User('user');

      console.log(str.constructor);
      console.log(arr.constructor);
      console.log(num.constructor);
      console.log(bool.constructor);
      console.log(obj.constructor);
      console.log(reg.constructor);
      console.log(fn.constructor);
      console.log(user.constructor);

      console.log(nullObj.constructor);
      console.log(undefinedObj.constructor);

      運行結果:

      運行到 console.log(nullObj.constructor); 的時候,瀏覽器報錯:Uncaught TypeError: Cannot read property 'constructor' of null。類似的問題也發(fā)生在console.log(undefinedObj.constructor); 上面:Uncaught TypeError: Cannot read property 'constructor' of undefined。

      3.Object.prototype.toString.call()

      最后要介紹的是jquery中使用的方式,Object.prototype.toString.call()。優(yōu)點是支持絕大多數(shù)類型的判斷,唯一的缺點是不支持自定義對象的判斷。

      測試代碼如下:

      var str='str';
      var arr=['1','2'];
      var num=1;
      var bool=true;
      var obj={name:'test'};
      var nullObj=null;
      var undefinedObj=undefined;
      var reg=/reg/;
      function fn(){
          alert('this is a function');
      }
      function User(name){
          this.name=name;
      }
      var user=new User('user');

      var toString=Object.prototype.toString;

      console.log(toString.call(str));
      console.log(toString.call(arr));
      console.log(toString.call(num));
      console.log(toString.call(bool));
      console.log(toString.call(obj));
      console.log(toString.call(reg));
      console.log(toString.call(fn));
      console.log(toString.call(user));
      console.log(toString.call(nullObj));
      console.log(toString.call(undefinedObj));

      運行結果:

      console.log(toString.call(user)); 的返回結果為:[object Object],不能做進一步判斷。

      總結

      javascript中經(jīng)常使用的對象判斷方式包括:typeof、constructor和Object.prototype.toString.call()。其中typeof很好理解,他是JavaScript本身支持的語法。constructor很少使用,但是相信大家通過demo也能看懂他代表的意思。至于Object.prototype.toString.call()可能多少會讓人有點費解,他和XXX.toString()有什么區(qū)別呢,為什么不能直接使用XXX.toString()呢?

      我們在瀏覽器中運行下面的代碼:

      var str='str';
      var arr=['1','2'];
      var num=1;
      var bool=true;
      var obj={name:'test'};
      var nullObj=null;
      var undefinedObj=undefined;
      var reg=/reg/;
      function fn(){
          alert('this is a function');
      }
      function User(name){
          this.name=name;
      }
      var user=new User('user');

      console.log(str.toString());
      console.log(arr.toString());
      console.log(num.toString());
      console.log(bool.toString());
      console.log(obj.toString());
      console.log(reg.toString());
      console.log(fn.toString());
      console.log(user.toString());
      console.log(nullObj.toString());
      console.log(undefinedObj.toString());

      查看運行結果:

      null和undefined因為不存在toString()方法,所以會報錯,我們就不去管他們了。至于其他對象,通過toString()返回的內(nèi)容和使用Object.prototype.toString.call()返回的內(nèi)容差別很大。這是因為Object.prototype.toString()方法被設計用來返回對象類型的。String、Array、Boolean、Regexp、Number和Function都繼承自Object,同時也就繼承了Object的原型方法toString(),但是他們都對toString()進行了重寫。執(zhí)行xxx.toString()時使用的是重寫后的方法,返回的結果自然會和Object.prototype.toString.call()的結果不一致。

      通過上面的例子,大家一定對這三種方式有了更深刻的認識,熟悉他們的優(yōu)缺點,然后可以根據(jù)自己的需要選擇合適的方式。推薦使用Object.prototype.toString.call()方法,因為他能解決絕大部分情況的判斷,在遇到返回值為[object Object]時,再使用constructor輔助判斷,看是否是自定義對象。

        相關評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)
        推薦文章

        沒有數(shù)據(jù)