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]"; }; } //......