js万物皆对象,只用typeOf是无法判断类型的。
基本类型(null):String(null);
基本类型(string/number/boolean/undefined)+function:直接typeof即可;
其他引用类型(Array/Date/RegExp Error):调用toString之后根据[object type]进行判断。
解析Object.toString方法:
每个对象都有toString方法,toString返回"[object type]",type指的是对象的类型;
用toString()来检测对象类型;
可以通过toString()来获取每个对象的类型。
为了每个对象都能通过Object.prototype.toString()来检测,需要以Function.prototype.call或者Function.prototype.apply()的形式来调用:
let toString = Object.prototype.toString;
toString.call(new Date);//[object Date]
toString.call(new String);//[object String]
toString.call(Math);//[object Math]
toString.call(undefined);//[object Undefined]
toString.call(null);/[object Null]
封装一个很稳的的类型判断函数:
let class2type={}
'Array Date RegExp Object Error'.split(' ').forEach(e=>class2Type['[object'+e+']']=e.toLowerCase())
function type(obj){
if(obj=null){
return String(obj)
}
return typeof obj ==='object' ? class2type[Object.toString.call(obj)] || 'object' : typeof obj
}
注:toLowerCase()把字符转为小写