Web前端之路

javascript万能的类型检测

2016-05-30  本文已影响102人  MakingChoice

javascript中类型检查有很多方法,比如typeof、instanceof、constructor、Object.prototype.toString()四种方法,前三种方法都存在不能检测的类型,只有第四种属于万能的。<p>

typeof

typeof的缺陷在于不能检测Array、json、null、Date()、Error类型。

instanceof

instanceof相当于实例对象的检测,instanceof 方法要求开发者明确地确认对象为某特定类型。

例如:

var person=new Person();
console.log(person instanceof Person)
num instanceof Number;
str instanceof String;
bool instanceof Bollean;
.....

不能完全检测的是,instanceof会把null和undefined检测为object类型。

constructor

constructor是对象上的属性,指向构造函数。实例对象寻找属性的顺序,实例对象上没有实例属性或方法时,就先去原型链上找,因此实例属性也可使用constructor属性。这种方式存在的缺陷是,除了undefined和null,其他类型的变量均能使用constructor判断出类型。

Object.prototype.toString()

Object.prototype.toString.call(变量)输出的是一个字符串,字符串里有一个数组,第一个参数是Object,第二个参数就是这个变量的类型,直接匹配这个类型就行。下面是一个封装好的库,可以直接用呀。<p>

J.$package(function(J){

    var ots=Object.prototype.toString;

    var type={
        /**
         * 判断是否数组
         * 
         * @name isArray
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否数组
         */   
        isArray : function(o){
            return o && (o.constructor === Array || ots.call(o) === "[object Array]");
        },
        /**
         * 判断是否Object
         * 
         * @name isObject 
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否Object
         */   
        isObject : function(o) {
            return o && (o.constructor === Object || ots.call(o) === "[object Object]");
        },
        /**
         * 判断是否布尔类型
         * 
         * @name isBoolean 
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否布尔类型
         */  
        isBoolean : function(o) {
            return (o === false || o) && (o.constructor === Boolean);
        },
        /**
         * 判断是否数值类型
         * 
         * @name isNumber
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否数值类型
         */  
        isNumber : function(o) {
            return (o === 0 || o) && o.constructor === Number;
        },
        /**
         * 判断是否undefined
         * 
         * @name isUndefined
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否undefined
         */ 
        isUndefined : function(o) {
               return typeof(o) === "undefined";
        },
        /**
         * 判断是否Null
         * 
         * @name isNull
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否Null
         */ 
        isNull : function(o) {
               return o === null;
        },
       /**
         * 判断是否function
         * 
         * @name isFunction
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否function
         */ 
        isFunction : function(o) {
               return o && (o.constructor === Function);
        },
       /**
         * 判断是否字符串
         * 
         * @name isString
         * @function
         * @memberOf J.type
         * @param {Object} o 判断对象
         * @return {boolean} 是否字符串
         */ 
        isString : function(o) {
            return (o === "" || o) && (o.constructor === String);
        }
    }
    J.type=type;
});
上一篇 下一篇

猜你喜欢

热点阅读