getVarType方法(以下)适用于几乎所有变量。
查看此fiddle。它首先使用非常快速的
typeof来处理结果可靠的情况。然后,对于其他情况,它使用更昂贵的
toString方法。最后,如果它正在处理命名对象(如Firefox返回的对象document.location),则会检查类似数组的对象并将它们报告为数组。
相比之下,
typeof表现非常差。typeof([])返回'object',typeof(new Number())返回object。对于许多其他实际上不是对象的变量,它也返回'object'。请参见fiddle结果进行比较。
getVarType = (function () {
var typeof_map = {
'undefined' : 'Undefined',
'boolean' : 'Boolean',
'number' : 'Number',
'string' : 'String',
'function' : 'Function',
'Undefined' : 'Undefined',
'Null' : 'Null',
'Boolean' : 'Boolean',
'Number' : 'Number',
'String' : 'String',
'Function' : 'Function',
'Array' : 'Array',
'StyleSheetList' : 'Array'
};
return function( data ) {
var type, type_str;
if ( data === null ) { return 'Null'; }
if ( data === undefined ) { return 'Undefined'; }
type = typeof( data );
type_str = typeof_map[ type ];
if ( type_str ) { return type_str; }
type = {}.toString.call( data ).slice( 8, -1 );
return typeof_map[ type ]
|| ( data instanceof Array ? 'Array' :
( data.propertyIsEnumerable(0) && data.length !== undefined
? 'Array' : 'Object' )
);
};
}());
唯一可能的故障模式发生在测试一个空的命名数组上(例如,除了StyleSheetList之外的空可枚举DOM对象)。但是,可以根据需要将它们添加到type_of_map中。
我希望这可以帮到您!
String
类型的对象。请参见typeof capitalized
。 - zerkms