首先说明下: 数组、函数、类数组对象 都是对象的一种。详情可见下图:JavaScript 数据类型
1、判断对象类型:内置对象(数组、函数、日期、正则表达式、错误 )、宿主对象(表示网页结构的HTMLElement对象)、自定义对象
/**
* [_isTypeOf description]
* @param {[object]} _data [对象]
* @param {[string]} _type [对象类型]
*内置对象:array,function,date,regexp,error
*宿主对象:htmlelement(htmldivelement,htmlbodyelement...),htmlcollection
*自定义对象:object
* @return {Boolean} [true/false]
*/
var _isTypeOf = function(_data,_type){
try{
_type = _type.toLowerCase();
if (_data===null) return _type=='null';
if (_data===undefined) return _type=='undefined';
return Object.prototype.toString.call(_data).toLowerCase()=='[object '+_type+']';
}catch(e){
return !1;
}
};
/* examples */
var sf=[1,2,3]; // 数组
var func1 = function(){console.log(123);}; //函数
var data= new Date(); //日期
var ng= /java/g; //正则表达式
var err=new Error(); //错误
var syntaxError1=new SyntaxError();
var typeError1=new TypeError();
var uriError1=new URIError();
var main=document.getElementById("main"); //表示网页结构的HTMLElement对象
var arrayLike1= document.getElementById("navList").getElementsByClassName("menu")
var sf2={"0":"df","1":"ff",length:2}; //类数组对象
var sf3={"0":"df","1":"ff"}; //普通对象
var sf4={ff:"fs",td:"fe"}; //普通对象
_isTypeOf(sf,"array")
_isTypeOf(func1,"function")
_isTypeOf(data,"date")
_isTypeOf(ng,"regexp")
_isTypeOf(err,"error")
_isTypeOf(syntaxError1,"error")
_isTypeOf(typeError1,"error")
_isTypeOf(uriError1,"error")
_isTypeOf(main,"html(...)element") //字符串的头是"html",尾是"element", 用正则表达式判断下
_isTypeOf(main,"htmlcollection")
_isTypeOf(sf2,"object")
_isTypeOf(sf3,"object")
_isTypeOf(sf4,"object")
/* 以上返回全部为true */
3、检测 类数组对象
类数组对象 定义 : 拥有 一个数值length属性 和 对应非负整数属性 的对象 看作是类数组对象。
function isArrayLike(o){
var _isTypeOf = function(_data,_type){
try{
_type = _type.toLowerCase();
if (_data===null) return _type=='null';
if (_data===undefined) return _type=='undefined';
return Object.prototype.toString.call(_data).toLowerCase()=='[object '+_type+']';
}catch(e){
return !1;
}
};
if( o && !_isTypeOf(o,"array") &&
typeof o === "object" &&
isFinite(o.length) &&
o.length >= 0 &&
o.length === Math.floor(o.length) &&
o.length < 4294967296 )
return true;
else
return false;
}