js类型检测

| 阅读数:--次| 作者:js,javascript
摘要:1、检测字符串(string)、数值(number)、布尔值(boolean)、未定义(undefined)、函数(function) 、对象(object)使用typeof(在Safari和Chrome中检测正则也会返回 "function")2、检测null 应用“===”,返回"null"3、...

1、检测字符串(string)、数值(number)、布尔值(boolean)、未定义(undefined)、函数(function) 、对象(object)使用typeof(在Safari和Chrome中检测正则也会返回 "function")

2、检测null 应用“===”,返回"null"

3、检测其它对象:

      方法一:利用instanceof/constructor  

      (再某些ie版本中存在跨iframe问题,每个iframe下都有自己的一套原型链,跨frame实例化的对象彼此是不共享原型链)

1 var isObject=value instanceof Object;
var isArray=value instanceof Array;//此处要想返回true,首先value必须是一个数组,而且必须与Array构造函数在同个全局作用域中。(Array是window的属性),如果value是在另一个frame中定义的数组,那么以上的代码会返回false.
var isDate=value instanceof Date;
var isRegExp=value instanceof RegExp;
var isError=value instanceof Error;
var isArray=(value.constructor == Array);

  方法二:利用 Object.prototype.toString.call()   (解决了方法一跨iframe 失效的问题)

1 Object.prototype.toString.call ({});          //"[object Object]"
Object.prototype.toString.call ([1,2,3,4]);   //"[object Array]"
Object.prototype.toString.call(new Date());   //"[object Date]"
Object.prototype.toString.call(/^hello/);     //"[object RegExp]"
Object.prototype.toString.call(new Error());  //"[object Error]"
Object.prototype.toString.call(new Number()); //"[object Number]"不建议用此方法创建变量
Object.prototype.toString.call(123);          //"[object Number]"
Object.prototype.toString.call(new String()); //"[object String]"不建议用此方法创建变量
Object.prototype.toString.call('abc');        //"[object String]"
Object.prototype.toString.call(new Boolean());//"[object Boolean]"不建议用此方法创建变量
Object.prototype.toString.call(true);         //"[object Boolean]"

综合typeof和instanceof封装一个获取类型的函数:

1 function type(ele) {
    var r;
    if (ele === null) r = 'null';
    else if (ele instanceof Array) r = 'array';
    else if (ele === window) r = 'window';
    else if (ele instanceof Date) r = 'date';
    else if (ele instanceof RegExp) r = 'regExp';
    else if (ele instanceof Function) r = 'function';
    else if (ele instanceof Error) r = 'Error';
    else r = typeof ele;
    return r;
}

参考jquery解决方案:

1 function type(obj) {
    var class2type = {};
    var toString = class2type.toString;
    var arry = "Boolean Number String Function Array Date RegExp Object Error".split(" ");
    arry.forEach(function(item, index) {
        class2type["[object " + item + "]"] = item.toLowerCase();
    });
    if (obj === null) {
        return obj + "";
    }
    return typeof obj === "object" || typeof obj === "function" ?
        class2type[toString.call(obj)] || "object" :
        typeof obj;
}

或者:

1 function getType(obj) {
    var typeName;
    return ((typeName = typeof(obj)) == "object" ? obj == null && "null" || Object.prototype.toString.call(obj).slice(8, -1):typeName).toLowerCase();
}

另外,ECMAScript 5 定义了一个新方法Array.isArray(),该函数在参数为数组时返回true,例如

       Array.isArray([1,2,3])     // true

       所以我们可以定义:  

1 if(typeof Function.isFunction=="undefined"){
   Function.isFunction=function(value){
       return Object.prototype.toString.call(value)==="[object Function]";
   };
}
if(typeof Array.isArray=="undefined"){
   Array.isArray=function(value){
       return Object.prototype.toString.call(value)==="[object Array]";
   };
}
if(typeof Date.isDate=="undefined"){
   Date.isDate=function(value){
       return Object.prototype.toString.call(value)==="[object Date]";
   };
}
if(typeof RegExp.isRegExp=="undefined"){
   RegExp.isRegExp=function(value){
       return Object.prototype.toString.call(value)==="[object RegExp]";
   };
}
if(typeof Error.isError=="undefined"){
   Error.isError=function(value){
       return Object.prototype.toString.call(value)==="[object Error]";
   };
}
if(typeof Object.isObject=="undefined"){
   Object.isObject=function(value){
       return Object.prototype.toString.call(value)==="[object Object]";
   };
}
//......

 

返回顶部
学到老代码浏览 关闭浏览