javascript 資料型別判斷

看風景就發表於2015-11-29

1. typeof

typeof返回值為字串,有六種型別

number,string,boolean,function,undefined,object,

typeof通常用來區分undefined和function型別,無法分辨復雜型別,例如array型別,和plain object型別

用 typeof(reValue) === "undefined" 來區分undefined,不用 reValue === undefined 來區分undefined,是因為reValue未宣告時,瀏覽器直接報錯

用typeof(reValue) === "function" 來檢測function

typeof可以區分基本型別,函式型別,其他的具體物件型別全部歸為物件型別

包括 new String('abc'), new Number('123'),null,Array都會被認為是物件型別

總之,typeof只能區分基本型別和函式型別,通常用來檢測undefined和function


2. instanceof

instanceof用來判斷物件例項與型別的關係,返回值為bool型別,不能跨iframe。

 

3. constructor

constructor檢測是使用物件的constructor屬性,其值為該物件型別的建構函式的引用。例如,num.constructor的值為function Number(){native code}。此方法可以用來判斷Array型別,例如 obj.constructor === Array 來判斷其型別是否為Array。

constructor方法有一些缺點,一是constructor屬性可以被修改,二是constructor的判斷不能穿越iframe。


4. Object.prototype.toString.call

此方法呼叫具體物件,會返回字串,共11種型別,如下

'[object Number]' '[object String]' '[object Boolean]' '[object Array]' '[object Object]'
'[object Function]' '[object Undefined]' '[object Null]' '[object Date]' '[object RegExp]' '[object Error]'

此方法是用來檢測型別的終極方法,jquery的type()方法就是使用此方法來判斷的,具體使用型別判斷時候,可以解決$.type的實現。

 

Object.prototype.toStirng.call的原理

1.呼叫物件的toString方法,會返回其字串形式,應為不同的型別重寫了toStirng方法,例如,
Array返回逗號連線的字串,function返回函式本身

2.呼叫物件的原型鏈上的Object的toString方法,會返回其物件型別[[class]],形式是
[object [[class]]]的一個字串,可以得到物件的具體型別

 

型別判斷總結

===   用來判斷   null
typeof  用來判斷       undefined,function,object
Object.prototype.toString.call 用來判斷 array,number,boolean等具體型別

Object.prototype.toString.call在ie6上有bug,string,undefined,null型別均為Object
在ie6上可以使用typeof來判斷string

資料型別判斷type方法簡單實現

function type(obj) {
    var class2type = {};
    'Boolean Number String Function Array Date RegExp Object Error Null Undefined'.split(' ').map((item, index) => {
        class2type['[object ' + item + ']'] = item.toLowerCase();
    });
    //object或function型別用toString判斷,基本型別用typeof判斷
    return typeof obj === 'object' || typeof obj === 'function' ?
        class2type[Object.prototype.toString.call(obj)] || 'object' : typeof obj;
}

 


參考:http://www.2cto.com/kf/201507/414817.html

相關文章