数据类型 | 检验数据类型的方法(含手写)
检验数据类型的方法有:
- typeof
 - instanceof
 - constructor
 - Object.prototype.toString.call()
 - 手写
 
typeof
typeof 的原理:JavaScript最初版本以32为的单位存储,包括一个小型类型标记(1-3)位和值的实际数据
- 000:object,表示这个数据是一个对象的引用
 - 1:int,表示这个数据是一个31位的有符号整型
 - 010:double,表示这个数据是一个双精度浮点数的引用
 - 100:string,表示这个数据是一个字符串的引用
 - 110:boolean,表示这个数据是一个布尔值
 因为Array和null前三位都是000,所以typeof检测为‘object’
1  | console.log(typeof 'hello'); // string  | 
数组、对象、null都会被判断为object,因此typeof方法有其弊端
instanceof
instanceof原理:用于检测构造函数的原型是否存在于实例对象的原型链上
注意:instanceof只能用于检测引用数据类型,如果是检测基本数据类型,直接返回false
1  | console.log(2 instanceof Number); // false  | 
constructor
constructor原理:实例对象通过constructor对象判断构造函数类型
1  | console.log([].constructor === Array); // true  | 
注意:如果创建一个对象改变了原型,constructor就不能用来判断数据类型
1  | function Fn() {};  | 
Object.prototype.toString.call()
Object.prototype.toString原理:当toString被调用的时候会执行以下操作:
- 获取this对象的[[Class]]属性的值([[Class]]是一个内部属性,表明了对象的类型)
 - 计算出三个字符串 “object” , 第一步的属性值,以及 “]” 三部分连接的新字符串
 - 返回第二步的结果
 
1  | console.log(Object.prototype.toString.call(2)); // [object Number]  | 
为什么Object.prototype.toString()和Object.prototype.toString.call()的检测结果不一样?因为Object.prototype.toString()是Object的原型方法,而Array,Function等类型作为Object的实例,都重写了toString方法,利用call是为了让()里面需要判断类型的数据类型来调用Object.prototype.toString方法
手写类型检测方法
实现思路
null直接返回null
基本数据类型直接用typeof
引用数据类型用Object.prototype.toString
1  | function testType(target) {  |