关于javascript的类型检测,根据浏览器的不同可能会产生不一样的结果,但是哥哥浏览器总有相同的地方,现在 总结一下各个浏览器通用的类型检测方法:
可以使用typeof的检测基本类型
String: typeof object === “string”
Number: typeof object === “number”
Boolean: typeof object === “boolean”
Object: typeof object === “object”
检测null类型
null: object === null
null or undefined: object == null
检测undefined类型
Global Variables全局变量: typeof variable === “undefined”
Local Variables 本地变量: variable === undefined
Properties属性: object.prop === undefined
检测是否为网页元素
Element: object.nodeType
检测复杂类型(jquery)(包括基本类型)
Plain Object: jQuery.isPlainObject( object )
Function: jQuery.isFunction( object )
Array: jQuery.isArray( object )
检测复杂类型(从jquery提取)(包括基本类型)
//前期准备
var class2type={};
class2type[ "[object Boolean]" ] ="boolean";
class2type[ "[object Number]" ] ="number";
class2type[ "[object String]" ] ="string";
class2type[ "[object Function]" ] ="function";
class2type[ "[object Array]" ] ="array";
class2type[ "[object Date]" ] ="date";
class2type[ "[object RegExp]" ] ="regexp";
class2type[ "[object Object]" ] ="object";
var type=function( obj ) {
return obj == null ?
String( obj ) :
class2type[ Object.prototype.toString.call(obj) ] || "object";
}
//如何使用
var isFunction = function( obj ) {
return type(obj) === "function";
}
var isArray = Array.isArray || function( obj ) {
return type(obj) === "array";
}
var isWindow = function( obj ) {
return obj != null && obj == obj.window;
}
var isPlainObject = function( obj ) {
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || isWindow( obj ) ) {
return false;
}
try {
if ( obj.constructor &&
! Object.prototype.hasOwnProperty.call(obj, "constructor") &&
! Object.prototype.hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
var key;
for ( key in obj ) {}
return key === undefined || Object.prototype.hasOwnProperty.call( obj, key );
}
var isNumeric = function( obj ) {
return !isNaN( parseFloat(obj) ) && isFinite( obj );
}
var isEmptyObject = function( obj ) {
var name;
for ( name in obj ) {
return false;
}
return true;
}
检测自定义函数类型
function __typeof__(objClass)
{
if ( objClass != undefined && objClass.constructor )
{
var strFun = objClass.constructor.toString();
var className = strFun.substr(0, strFun.indexOf('('));
className = className.replace('function', '');
className= className.replace(/(^\s*)|(\s*$)/ig, '');
return className==""?"Anonymous":className;
}
return typeof(objClass);
}
//使用方法
<script language="javascript">
alert(__typeof__(jsclass));
alert(__typeof__(JSClass));
alert(__typeof__(1));
alert(__typeof__([]));
alert(__typeof__({}));
</script>
//结果分别为:"JSClass", "Function", "Number", "Array"和"Object"。
来自本方法来源
基本原理是由于objClass里有一个constructor指针,这个指针指向了创建objClass的function。我们找到这个function用tostring来返回整个function的字符串定义。然后截取前方的函数定义名(当然如果用var xxx=function(){}那么他就是一个匿名函数。返回一个Anonymous代替)
另外javascript还有一个方法instantof 这个并不是类型检测但却能知道这个对象究竟是哪个类型以及其父类型下的,返回bool值。比如
var a=new Array();
if (a instanceof Object) {
alert('Y');
}else {**重点内容**
alert('N')
}
返回为Y.
以上总结各有优缺点,基本上原生的方法typeof是最快的也是最推荐使用的。但是他的缺点也是最明显。有些类型不能真正的判断。如果你要判断的不是基本类型。那么使用typeof也是不错的选择,毕竟他可以获得自定义类型。同时兼顾了基本类型。不过鉴于我所使用的测试平台基本上限于浏览器,没有在其他平台上做测试。不知道能否使用。