在ECMAScript中,共定义了7种数据类型,分为基本类型和引用类型,如下所示:

基本类型:String、Number、Boolean、Symbol、Undefined、Null
引用类型:Object
基本类型也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈中,即按值访问。
引用类型也称为复杂类型,由于其值的大小会改变,所以不能将其存储在栈中,否则会降低变量查询速度,因此,将其存储在堆中,而存储在变量处的值是一个指针,指向存储对象的内存处,即按址访问。引用类型除Object外,还有Array、Function、Date、RegExp等。

一、typeof

typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果包括以下7种类型:Number、String、Boolean、Symbol、Undefined、Object、Function

typeof返回的值大致归为:

  • 对于基本类型,除null外一律返回正常类型
  • 对于引用类型,除function外,一律返回object
  • Null返回object类型
  • Function返回function类型

其中,null有属于自己的数据类型null,引用类型中的数组、日期、正则也有属于自己的数据类型,而typeof对于这些类型的处理,只返回了处于其原型链最顶端的Object类型。

二、Instanceof

Instanceof用来判断A是否是B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则,返回false。

三、Constructor

当一个函数F被定义时,JS引擎会为F添加一个prototype原型,然后再在prototype上添加constructor属性,并让其指向F的引用。

四、Object.prototype.toString()

toString是Object的原型方法。对于Object对象,直接调用toString()对于其他对象,则需要通过call/apply来返回正确的类型信息。