在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。
对于数组、函数、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。
如何判断 对象、数组、函数等复杂类型?
要想区别对象、数组、函数,单纯使用 typeof 是不行的,JavaScript中可以通过Object.prototype.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]'; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219521.html原文链接:https://javaforall.net
