getVarType方法(如下)适用于几乎所有变量。看看这个小提琴。对于结果可靠的情况,它首先使用非常快速的typeof 。然后它在其他情况下使用更昂贵的toString方法。最后,如果它正在处理一个命名对象(由 Firefox 为像 document.location 这样的对象返回),它会检查类似数组的对象并将它们报告为数组。
相比之下,typeof 就差的很尴尬了。typeof([]) 返回“对象”,typeof(new Number()) 返回对象。它还为许多其他不是(出于实际目的)对象的变量返回“对象”。请参阅小提琴结果进行比较。
// Begin public utility /getVarType/
// Returns 'Function', 'Object', 'Array',
// 'String', 'Number', 'Null', 'Boolean', or 'Undefined'
//
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' )
);
};
}());
// End public utility /getVarType/
如果您正在测试一个空的命名数组(例如除了 StyleSheetList 之外的一个空的可枚举 DOM 对象),则唯一可能的失败模式会发生。但是 on 可以根据需要将它们添加到 type_of_map 中。
我希望这会有所帮助!