在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来返回正确的类型信息。