一、常见判断:typeof
- 这个方法很常见,一般用来判断基本数据类型,如:string,number,boolean,symbol,bigint(es10新增一种
基本数据类型bigint),undefined等。返回数据类型的字符串形式
typeof目前能返回string,number,boolean,symbol,bigint,unfined,object,function这八种判断类型,但是注意null返回的是Object。而且对于引用类型返回的是object因为所有的对象的原型最终都是Object。
1 | //例子 |
为什么typeof null是Object
答:因为在钉avaScript中,不同的对象都是使用二进制存储的,如果二进制前三位都是0的话,系统会判断为是
Objecta类型,而null的二进制全是0,自然也就判断为Object
这个bug是初版本的JavaScriptr中留下的,扩展一下其他五种标识位:
- 000对象
- 1整型
- 010双精度类型
- 100字符串
- 110布尔类型
二、已知对象判断:instanceof
- 用来判断引用数据类型的,判断基本数据类型无效,如:Object,Function,Array,Date,RegExp等,
instanceof主要的作用就是判断一个实例是否属于某种类型 - instanceof也可以判断一个实例是否是其父类型或者祖先类型
- instanceof原理实际上就是查找目标对象的原型链
1 | //例子 |
手写实现一个
1 | //手写实现 |
三、根据对象的构造器:constructor
与instanceof相似,但是对于instanceof只能再检测用类型,而constructor还可以检测基本类型,因为constructor是原型对象的属性指向构造函数。
注意
- null和undefined是无效的对象,因此是不会有constructor存在的,所以无法根据constructor来判断。
- JS对象的constructor是不稳定的,这个主要体现在自定义对象上,当开发者重写prototype后,原有的
constructor会丢失,constructor会默i认为Object - 类继承的也会出错,因为Object被覆盖了,检测结果就不对了
四、对象原型链判断:Object.prototype.toString.cal(这个是判断类型最准的方法)
- toString是Object原型对象上的-个方法,该方法默认返回其调用者的具体类型,更严格的讲,是toStringi运行时
this指向的对象类型,返回的类型格式为[object,XXx],XXx是具体的数据类型,其中包括:Sng,Number,
Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument..基本上所有对象
的类型都可以通过这个方法状取到。 - 必须通过Object.prototype..toString.call来获取,而不能直接new Date().toString),从原型链的角度讲,所有
对象的原型链最终都指向了Object,按照S变量查找规则,其他对象应该也可以直接访问到Object的toString方
法,而事实上,大部分的对象都实现了自身的toString方法,这样就可能会导致Object的toString被终止查
找,因此要用cal来强制执行Object的toString方法。 - 缺点:不能再细分
1 | //例子 |
简单来说,JavaScript中我们有四种方法来判断数据类型。
一般使用ypeof来判断基本数据类型,不过需要注意当遇到u的问题,这里不足就是不能判断对象具休类型
(typeof xjj只是Object不能看出是person):
而在要判断一个对象的具体类型,就可以用nstanceof,但是也可能不准确,对于一些基础数据类型,数组等会被
判断为object。
结合typeof和instanceof的特点,还能使用constructor来判断,他能判断基本类型和引用类型,但是对于null和
undefined是无效的,以及constructor不太稳定。
最后如果需要判断准确的内置类型,就可以使用object.prototy pe.toString.call,是根据原型对象上的tostring方法获取的,该方法默认返回其调用者的具体类型。