JS中数据类型检测有哪些
- typeof [value] :检测数据类型的运算符
- [example] instanceof [class] : 检测某一个实例是否属于这个类
- [example].constructor === [class] :检测实例和类关系的,从而检测数据类型
- Object.prototype.toString.call([value]):检测数据类型
typeof
该关键字使用起来简单,基本数据类型和引用数据类型基本上都可以有效检测
1 2 3 4 5 6 7 8 9
| console.log(typeof 1); console.log(typeof 1n); console.log(typeof '1'); console.log(typeof []); console.log(typeof null); console.log(typeof a); console.log(typeof true); console.log(typeof function() {}); console.log(typeof Symbol('1'));
|
一些需要注意的地方:
- NaN / Infinity 都是数字类型的,检测结果都是 number
- typeof null 的结果是 object
所有的值在计算中都以二进制编码储存,浏览器中把前三位000的当作对象,而null的二进制前三位是000,所以被识别为对象,但是他不是对象,他是空对象指针,是基本类型值
instanceof
该关键字用来检测某个实例是否属于这个类, 即类的原型只要出现在了实例的原型链上就返回 true,基于这种方式,可以弥补 typeof 无法细分对象类型的缺点(想检测这个值是否为数组,只需要看他是否为Array类的实例即可)
1 2 3 4
| let arr = []; console.log(arr instanceof Array); console.log(arr instanceof Object); console.log(arr instanceof Date);
|
一些需要注意的地方:
- 被检测的实例必须是引用类型,对基本数据类型值操作无效
constructor
该关键字判断当前实例的 constructor 属性是不是预估的类
1 2 3 4 5 6 7
| let arr = []; console.log(arr.constructor === Array); console.log(arr.constructor === Array.prototype.constructor);
let obj = {}; console.log(obj.constructor instanceof Object); console.log(obj.constructor instanceof Object.prototype.constructor);
|
一些需要注意的地方:
- 有可能不准确, constructor 属性能够被用户修改
- null 和 undefined 不适用
Object.prototype.toString.call()
每种数据类型的构造函数的原型上都有toString方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| let toString = Object.prototype.toString;
console.log(toString.call(10)); console.log(toString.call(NaN)); console.log(toString.call('xxx')); console.log(toString.call(true)); console.log(toString.call(null)); console.log(toString.call(undefined)); console.log(toString.call(Symbol())); console.log(toString.call(BigInt(10))); console.log(toString.call({xxx:'xxx'})); console.log(toString.call([10,20])); console.log(toString.call(/^\d+$/)); console.log(toString.call(function(){}));
|
一些需要注意的地方:
- 自定义类返回的都是 [object Object]