JS如何查看对象的类型

在JS中,我们可以使用typeof操作符检测值的类型,但当需要检测的值是对象时,结果就没那么友好了。

例如:

如上图所示:在JS中,typeof操作符一共会返回七种类型的值,其中对字符串(String)、数值(Number)、布尔值(Boolean)、函数(Function)、符号(Symbol)、未定义(Undefined)这六种类型值的判别比较直观,但对于对象(Object)、数组(Array)、空值(Null)等类型来说,返回值都是"Object",并没有进一步区分对象的类型,这就显得比较笼统。

那么我们应该如何查看对象的类型,从而判断出对象是一个普通对象,还是一个数组或其他类型的对象呢?

推荐使用以下两种方法:

第一种是使用instanceof操作符,左侧是要查看的对象,右侧是一个构造函数,如果构造函数的prototype属性(指向构造函数实例的原型对象)在这个对象的原型链上,则对象属于这个构造函数对应的“类”。

例如:

使用instanceof操作符测试出[]不仅继承自Object类,也继承自Array类。

或者新建一个构造函数Dog,然后生成一个实例对象newDog,使用instanceof操作符可以测试出对象newDog不仅继承自Object类,也继承自Dog类。

使用instanceof操作符的缺点是必须去指定一个类,再去测试对象是否继承自这个类。

还有一个巧妙的方法是调用Objectprototype属性对象中的toString()方法。

例如:

这样就会返回包含对象类型的结果。

为了使用更方便,我们把语句写入一个函数,并提取我们需要的部分。

注意!一定要用call()方法来改变函数的执行上下文为当前对象,否则返回结果将一直是'[object Object]'

默认情况下,Object.prototype.toString()这种特殊的用法只对内置类型的实例有效,如果对自己定义的类的实例调用classof(),那只能得到'Object'

如果想要使它对自己定义的类的实例同样有效,可以在类的prototype属性指向的对象中定义一个获取函数,名称为符号名Symbol.toStringTag

这样,Object.prototype.toString()会查找自己的参数中有没有一个属性的符号名为Symbol.toStringTag,如果有这样一个属性,则使用这个属性的值作为输出。

例如: