JavaScript中類型檢測

文章首發: http://www.cnblogs.com/sprying/p/4349426.htmljavascript

本文羅列了通常Js類型檢測的方法,是構建Js知識體系的一小塊,這篇文章是我很早以前總結的。html

1、Js中有5種基本數據類型

Undefined 、Null、Boolean、String、Number(包含NaN)
 
NaN和任何類型的值都不相等,包括NaN;isNaN用來判斷數值是否是NaN類型   

2、類型判斷

1. isFinite(number)
是否是無窮大。若是是NaN,或者正負無窮大,或者非數字類型,則返回false。 

 

2. typeof運算符
使用的時候,空格或者typeof(param)
 
返回的值
string
number
boolean
undefined
function
object null也返回object
 
根據以上,判斷類型能夠以下:
var obtainType = function(o){
     var t;
     if(o === null ) return 「null」;
     else if(o !== o) return 「NaN」;
     else if( (t = typeof o) !== ‘object’) return t;
}
能夠識別出null、NaN string number boolean undefined function。
 
上面最後只剩下object,好比數組的識別,自定義類型的識別
 
3. 數組等原生類型的識別,能夠採用以下
function obtainType(type) {
    return function (obj) {
        return Object.prototype.toString.call(obj) === "[object " + type + "]"
    }
}

var isObject = isType("Object")
var isString = isType("String")
var isArray = Array.isArray || isType("Array")
var isFunction = isType("Function")

 

4. 自定義類型判斷
/**
 * 返回函數的名字,可能爲空串;不是函數,返回null
 */
Function.prototype.getName = function () {
    if ("name" in this) return this.name;
    return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];
};

 

原生類型和自定義類型的object均可以判斷了,因而
/**
 * 返回:null NaN undefined string number boolean
 * function Array String Object(包括一些自定義類型) 自定義類型
 */
var obtainType =function(o){
    /**
     * 獲取參數類型
     * 對象直接量、Object.create、自定義構造函數的類屬性皆爲Object;
     * 識別出原生類型 (內置構造函數和宿主對象)
     */
    function classOf(obj){
        return Object.prototype.toString.call(obj).slice(8, -1);
    }

    /**
     * 返回函數的名字,可能爲空串;不是函數,返回null
     */
    Function.prototype.getName = function () {
        if ("name" in this) return this.name;
        return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];
    };
    var t, c, n;
    // 處理null值特殊情形
    if (o === null) return "null";
    // NaN:和自身值不相等
    if (o !== o) return "NaN";
    // 識別出原生值類型和函數、undefined
    if ((t = typeof o) !== "object") return t;
    // 識別出原生類型
    if ((c = classOf(o)) !== "Object") return c;
    // 返回自定義類型構造函數名字
    if (o.constructor && typeof o.constructor === "function" &&
        (n = o.constructor.getName()))
        return n;
    return "Object";
};

 

5.java

var strObj = new String('abc');

typeof strObj // "object"

obtainType(strObj) // "String"

 

3、 其它

1. Dom元素判斷
if(dom.nodeType){...Dom...}
if(dom.createElement)
 
2. jQuery等類型判斷
$('#aa') instanceof jQuery//不支持跨多窗口和框架子頁面
 
3. if(a) a爲null undefined 0 "" NaN時自動轉換成false
通常推薦的寫法
// bad
if (name !== '') {
    // ...stuff...
}

// good
if (name) {
    // ...stuff...
}

// bad
if (collection.length > 0) {
    // ...stuff...
}

// good
if (collection.length) {
    // ...stuff...
}
相關文章
相關標籤/搜索