正確判斷js數據類型 總結記錄

正確判斷js數據類型 總結記錄

判斷js中的數據類型有一下幾種方法:typeof、instanceof、 constructor、 prototype、 三方庫。數組

js六大數據類型

number:   數字,整數、浮點數等等,
string:   單引號或者雙引號來講明,
Boolean:  返回true和false,這兩個值不必定對應1和0
object:   對象,能夠執行new操做符後跟要建立的對象類型的名稱來建立。
null:     只有一個值得數據類型,邏輯上講,null值表示一個空對象指針。
undefined:未定義,使用var聲明變量但未對其初始化時,變量的值就是undefined。

一、typeof

在實際的項目應用中,typeof只有兩個用途,就是檢測一個元素是否爲undefined,或者是否爲function。緣由以下:
JavaScript Garden整理出來了以下表格框架

Value               function   typeof
-------------------------------------
"foo"               String     string
new String("foo")   String     object
1.2                 Number     number
new Number(1.2)     Number     object
true                Boolean    boolean
new Boolean(true)   Boolean    object
new Date()          Date       object
new Error()         Error      object
[1,2,3]             Array      object
new Array(1, 2, 3)  Array      object
new Function("")    Function   function
/abc/g              RegExp     object
new RegExp("meow")  RegExp     object
{}                  Object     object
new Object()        Object     object

二、instanceof

var a = [1,2,3];
var b = new Date();
var c = function(){};

alert(a instanceof Array) ---------------> true
alert(b instanceof Date) 
alert(c instanceof Function) ------------> true
alert(c instanceof function) ------------> false

三、constructor

var a = [1,2,3];
var b = new Date();
var c = function(){};

alert(a.constructor === Array) ----------> true
alert(b.constructor === Date) -----------> true
alert(c.constructor === Function) -------> true

注:
      使用instaceof和construcor,被判斷的引用類型(Object Array)必須是在當前頁面聲明的!好比,一個頁面(父頁面)有一個框架,框架中引用了一個頁面(子頁面),在子頁面中聲明瞭一個array,並將其賦值給父頁面的一個變量,這時判斷該變量,Array ==object.constructor;會返回false;
緣由:
一、array屬於引用型數據,在傳遞過程當中,僅僅是引用地址的傳遞。
二、每一個頁面的Array原生對象所引用的地址是不同的,在子頁面聲明的array,所對應的構造函數,是子頁面的Array對象;父頁面來進行判斷,使用的Array並不等於子頁面的Array。函數

四、Object.prototype.toString(通用)

Object.prototype.toString.call()
var toString = Object.prototype.toString;

toString.call(undefined);  -------------> [object Undefined]
toString.call(null);       -------------> [object Null]
toString.call(new Date);   -------------> [object Date]
toString.call(new String); -------------> [object String]
toString.call(Math);       -------------> [object Math]

jQuery.type()源碼大數據

var class2type = {} ;
"Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(e,i){
    class2type[ "[object " + e + "]" ] = e.toLowerCase();
}) ;

function _typeof(obj){
    if ( obj == null ){
        return String( obj );
    }
    return typeof obj === "object" || typeof obj === "function" ?
        class2type[ class2type.toString.call(obj) ] || "object" :
        typeof obj;
}

注:數組還能夠用 Array.isArray(); 或者根據其具備的方法去判斷。再也不細述prototype

相關文章
相關標籤/搜索