JS数据类型
值类型(基本数据类型):Number、String、Boolean、Null、Undefined、Symbol、BigInt
引用数据类型(对象类型):Object、Array、Function、RegExp、Data
typeof
typeof
操作符返回一个字符串,表示未经计算的操作数的类型
1 | typeof operand |
operand
表示对象或原始值的表达式,其类型将被返回
1 | typeof 1 // 'number' |
可以看到,typeof
能够对基本数据类型进行判断(除了null),无法明确判断引用数据类型
instanceof
instanceof
运算符返回一个布尔值,用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。
1 | object instanceof constructor |
简单来说,A instanceof B
用来判断A是否继承了B
instanceof
的原理(判断步骤)如下:
(1)先用typeof
判断A,如果A是基本数据类型,则直接返回false
。因此instanceof
无法很好的判断基本数据类型
(2)如果A不是基本数据类型,则通过A的原型链进行查找,看是否能找到B的显示原型
我们知道,JS对象的隐式原型指向其构造函数的显示原型,因此instanceof
就是看B对象的显示原型是否在A对象的(隐式)原型链上,是的话则返回true,若找到原型链尽头也未找到,则返回false。
实现原理如下:
1 | function myInstanceof(left, right) { |
因此,就有如下判断
1 | // 定义构建函数 |
toString
toString
方法真正指的是Object.prototype.toString.call()
通过调用Object
显示原型上的toString
方法即可返回对象的数据类型。
1 | Object.prototype.toString({}) // "[object Object]" |
总结
typeof
方法可以给出简单数据类型的具体类别,null除外
instanceof
方法可以通过原型链判断是否有继承关系,返回布尔值
toString
方法可以对所有JS对象返回具体的类型
深入探究toString
在JavaScript中,所有的类都继承于Object,因此Object.prototype.toString()
方法应该能够被所有对象通过Obj.toString()
访问到,并以字符串返回其数据类型
但实际验证结果如下:
1 | var num = 123 |
可以看到:
简单数据类型的toString()
方法直接将数据转化为字符串
引用数据类型的toString()
方法返回其构造函数
Null
、Undefined
没有toString()
方法
这是因为JS中各种数据类型不是Object最直接的实例化对象,而是Number、String、Boolean…
等等这些类的实例对象。
而这些类在实例化各种数据的时候,改写了toString()
方法,因此各数据类型沿原型链使用toString()
方法时,到达其构造函数就停止了。
Object.prototype.toString.call()
通过call()
改变this指向,使得数据跳过了原型链上的构造函数,直接使用到了Object身上的toString()
方法,于是就返回了明确的数据类型
参考文章