js类型检测

98 阅读2分钟

常用的有typeof、instanceof、constructor、Object.prototype.toString这四种,各有利弊。

typeof

底层机制:直接在计算机底层基于数据类型(二进制)进行检测

image.png

typeof null =>object 原因是null在底层的存储值是000 对象存储在计算机中都是以三个0开始的二进制存储。null也是 所以检测出来的结果是对象 可以理解为这是一个bug

普通对象/正则对象/数组对象/日期对象检测出来都是object

总结:typeof只合适于基础类型的数据

instanceof

底层机制:只要当前类出现在实例的原型链上,结果都是true

临时拿来当壮丁 拿来解决typeof的不足。可以手动修改原型的指向

image.png

不足

1、由于我们可以肆意的修改原型的指向,所以检测出来的结果是不准的

2、不能检测基本类型

手撕instanceof

image.png

constructor

1、用起来看似比instanceof好用一些(基本类型支持的)

2、constructor也可以随便改 所以也不准

image.png

Object.prototype.toString.call([vaule])

标准检测数据类型的方法

Object.prototype.toString不是转换为字符串,是返回当前实例所属类的信息

let obj = { name: 'yyy' }

console.log(obj.toString()); // [object Object]

toString方法执行 this是obj,所以检测的是obj所属类的信息

推测:是不是只要调用Object.prototype.toString执行,让他里面的this变为要检测的值,那就行返回当前值所属类的信息

image.png

总结:

这几种方法对比下来感觉Object.prototype.toString方法最标准 但是比较麻烦 相对而言 typeof比较简单 typeof只是某些类型检测不准 但是不影响基础类型的检测 所以 typeof和Object.prototype.toString方法结合着只用

手写一个比较完成的数据检测类型的标准方法:

image.png