在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。
对于数组、函数、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。
如何判断 对象、数组、函数等复杂类型?
要想区别对象、数组、函数,单纯使用 typeof 是不行的,JavaScript中可以通过Object.prototype.toString方法来判断。
Object.prototype.toString()
toString方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串。因此可以用来判断一个值的类型。
如:
var o = {};
o.toString(); // "[object Object]"
上面代码调用空对象的toString
方法,结果返回一个字符串object Object
,其中第二个Object
表示该值的构造函数。这是一个十分有用的判断数据类型的方法。
但是,数组、字符串、函数、Date对象都分别覆写了自己版本的toString
方法,覆盖了Object.prototype.toString
方法。
var arr = [];
arr.toString(); //''
[1, 2, 3].toString() // "1,2,3"
'123'.toString() // "123"
我们发现实例对象可能会自定义toString
方法,覆盖掉Object.prototype.toString
方法。通过函数的call
方法,可以在任意值上调用Object.prototype.toString
方法,帮助我们判断这个值的类型。
Object.prototype.toString.call(value)
例子:
var arr = [];
console.log(Object.prototype.toString.call(arr))
// "[object Array]"
由于 JavaScript 中一切都是对象,任何都不例外,对所有值类型应用 Object.prototype.toString.call() 方法结果如下:
console.log(Object.prototype.toString.call(123)) //[object Number]
console.log(Object.prototype.toString.call('123')) //[object String]
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
console.log(Object.prototype.toString.call(true)) //[object Boolean]
console.log(Object.prototype.toString.call({})) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]
console.log(Object.prototype.toString.call(function(){})) //[object Function]
扩展:实现判断对象类型的函数
//判断是否为函数
function isFunction(it) {
return Object.prototype.toString.call(it) === '[object Function]';
}
//判断是否为数组:
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}