数据类型 | 检验数据类型的方法(含手写)
检验数据类型的方法有:
- 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) { |