typeof可以判断数据类型,为什么要使用Object.prototype.toString?
使用typeof只能判断基本数据类型Number、String、Boolean、Undefined、复杂数据Object,但是Null、RegExp、Date、引用类型Array、Function都返回Object;
可以使用对象的原生扩展函数Object.prototype.toString判断对象的内置类型,输出格式[object 对象数据类型],如果要得到数据类型值可以使用slice截取,Object.prototype.toString.call(对象).slice( 8, -1);
也可以写成toString.call(对象).slice( 8, -1) ,对象都继承自Object,所以对象调用一个方法时会先在该对象上进行查找如果没找,则会一层一层查找原型、原型的原型、Object.prototype,toString.call()实际是调用了Object.prototype.toString。
数值:返回[object Number]。
字符串:返回[object String]。
布尔值:返回[object Boolean]。
undefined:返回[object Undefined]。
null:返回[object Null]。
数组:返回[object Array]。
arguments 对象:返回[object Arguments]。
函数:返回[object Function]。
Error 对象:返回[object Error]。
Date 对象:返回[object Date]。
RegExp 对象:返回[object RegExp]。
其他对象:返回[object Object]。
探究下为什么要使用Object.prototype.toString来获取数据类型?
toString() 方法返回该对象的字符串,语法Object.toString(),每个对象都有一个toString()方法。
var obj = {
id: 1
};
obj.toString(); //输出"[object Object]"
为什么会输出数据类型,因为自定义obj是继承Object的toString()方法。
var obj = [1, 2];
obj.toString(); //输出"1,2"
为什么数组会输出转换为字符串的值,因为它调用的是Array.prototype的toString()方法,但Array.prototype的toString()方法被重写了。
大部分对象都重写了toString()方法:
对象 | 输出 |
---|---|
Array | 元素转换为字符串,两个元素之间用英文逗号分隔 |
Date | 返回日期时间 |
String | 返回对象的字符串值 |
Number | 返回对象的字符串值,可以返回进制的字符串 |
Boolean | 返回对象的字符串值,true返回"true",false返回"false" |
... | ... |
提示:Object.prototype.toString()是可以重写的,使用这个方法判断数据类型,前提是此方法未被重写。