JS中数据类型的检测方法

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); // number
console.log(typeof 1n); // bigint
console.log(typeof '1'); // string
console.log(typeof []); // object
console.log(typeof null); // object
console.log(typeof a); // undefined
console.log(typeof true); // boolean
console.log(typeof function() {}); // function
console.log(typeof Symbol('1')); // symbol

一些需要注意的地方:

  • NaN / Infinity 都是数字类型的,检测结果都是 number
  • typeof null 的结果是 object
    所有的值在计算中都以二进制编码储存,浏览器中把前三位000的当作对象,而null的二进制前三位是000,所以被识别为对象,但是他不是对象,他是空对象指针,是基本类型值

instanceof

该关键字用来检测某个实例是否属于这个类, 即类的原型只要出现在了实例的原型链上就返回 true,基于这种方式,可以弥补 typeof 无法细分对象类型的缺点(想检测这个值是否为数组,只需要看他是否为Array类的实例即可)

1
2
3
4
let arr = [];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
console.log(arr instanceof Date); // false

一些需要注意的地方:

  • 被检测的实例必须是引用类型,对基本数据类型值操作无效

constructor

该关键字判断当前实例的 constructor 属性是不是预估的类

1
2
3
4
5
6
7
let arr = [];
console.log(arr.constructor === Array); // true
console.log(arr.constructor === Array.prototype.constructor); // true

let obj = {};
console.log(obj.constructor instanceof Object); // true
console.log(obj.constructor instanceof Object.prototype.constructor); // true

一些需要注意的地方:

  • 有可能不准确, 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)); //[object Number]
console.log(toString.call(NaN)); //[object Number]
console.log(toString.call('xxx')); //[object String]
console.log(toString.call(true)); //[object Boolean]
console.log(toString.call(null)); //[object Null]
console.log(toString.call(undefined)); //[object Undefined]
console.log(toString.call(Symbol())); //[object Symbol]
console.log(toString.call(BigInt(10))); //[object BigInt]
console.log(toString.call({xxx:'xxx'})); //[object Object]
console.log(toString.call([10,20])); //[object Array]
console.log(toString.call(/^\d+$/)); //[object RegExp]
console.log(toString.call(function(){})); //[object Function]

一些需要注意的地方:

  • 自定义类返回的都是 [object Object]