js物件導向編程:如何檢測物件類型

來源:互聯網
上載者:User

js物件導向編程:如何檢測物件類型

在js中檢測物件類型主要有三種,typeof,instanceof,constructor,這幾種都可以檢測對象的類型,但又有一定的區別。



1使用typeof檢測物件類型。

typeo作為最常用的檢測類型的方法,返回字串類型,具體使用如下:

 function testType(value) { var str=typeof(value); //  alert(str);    switch(str)   {    case 'undefined': // undefined類型      case 'object' : // null類型,任意內建對象,數組    case 'boolean' : // true,false類型    case 'string' : // string字串類型    case 'function':  //任意函數    case 'number': //任意的數實值型別,包含NaN  }  }

可以看到,對於最基本的類型可以測試出類型,但對於其他的,包括日期,數組等大多都返回object類型,而且null也返回的是object類型,也就是沒有辦法知道確切的類型。


另一種改進的檢測方法,是使用,預設的ToString,繼承自object,可以傳回型別資訊

 function classof(o) {      if (o === null) return "Null";      if (o === undefined) return "Undefined";      return Object.prototype.toString.call(o).slice(8,-1);   } function testType(value) { var str=classof(value);//typeof(value);   alert(str);   switch(str)   {    case 'undefined': // undefined類型      case 'object' : // 對象    case 'Boolean' : // true,false類型    case 'String' : // string字串類型case 'Function':  //任意函數case 'Number': //任意的數實值型別,包含NaN            case 'Date'://日期case 'Array'://數組case 'RegExp'://正則  } }

可以看到改進了一部分,但object類型還是有很大一部分。



2使用instanceof檢測物件類型

對於typeof檢測為object類型的可以使用instanceof進一步檢測具體的類型。instanceof實際上檢測的對象的原型。

可以檢測變數是不是某個對象的執行個體,返回bool值。

例如:

                       var value=new Date();var isdate= value instanceof Date alert(isdate);

3使用constructor檢測物件類型檢測物件類型

constructor相當於檢測建構函式,返回的是一個函數

例如:

 function testconstructor(value) {   var str=value.constructor;   switch(value.constructor)   {   case Number: //數實值型別    break;   }  //  alert(str); }


如果需要檢測一個對象的確切類型,可以綜合使用這三種方法

例如:

function type(o) {    var t, c, n;  // type, class, name    // 是null類型:    if (o === null) return "null";    // 是數值中的特殊類型: NaN :    if (o !== o) return "nan";    // 使用 typeof 檢測除去 "object"類型為的其他類型.       if ((t = typeof o) !== "object") return t;    // typeof檢測為"object"類型,則進一步檢測    // 可以檢測出大部分內建類型    if ((c = classof(o)) !== "Object") return c;    // classof(o)返回為"Object"時,檢測constructor    if (o.constructor && typeof o.constructor === "function" &&        (n = o.constructor.getName())) return n;    // 無法識別的其他類型,預設為"Object"    return "Object";}function classof(o) {    return Object.prototype.toString.call(o).slice(8,-1);};    // 返回function的名稱,可能為""或者 nullFunction.prototype.getName = function() {    if ("name" in this) return this.name;    return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];};


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.