js 精确判断对象的类型

        在 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]';  
}

猜你喜欢

转载自blog.csdn.net/icanlove/article/details/43702879