- typeof
语法:typeof [val] 返回当前值对应的数据类型(STRING)
优势:检测基本类型值还是很准确的,而且操作起来方便
略势:
typeof null =>"object" 【01开头存储的是对象。】
typeof 检测数组/对象/正则等都是 "object",所以无法对对象数据类型细分
- instanceof
语法:[val] instanceof 类, 通过检测这个值是否属于这个类,从而验证是否为这个类型
优势:对于数组、正则、对象可以细分一下
略势:
基本数据类型无法基于它来进行检测
检测的原理:只要在当前实例的__proto__出现这个类,检测结果都是TRUR
- constructor
和instanceof类似,也是非专业检测数据类型的,但是可以这样处理一下
语法:[val].constructor === 类
相对于instanceof来讲,基本类型也可以处理,而且因为获取实例的constructor实际上获取的是直接所属的类,
所以在检测准确性上比instanceof还好一点
略势:constructor是可以随意被改动的
- Object.prototype.toString.call([val]):最强大的检测方案
在其它数据类型的内置类原型上有toString,但是都是用来转换为字符串的,
只有Object基类原型上的toString是用来检测数据类型的。
[11, 22].toString()的结果:去掉逗号后面空格的"11,22"。
obj.toString(): obj这个实例调用Object.prototype.toString执行,方法执行里面的THIS是当前操作的实例OBJ,此方法就是检测实例THIS的数据类型的,返回结果:"[object 所属的类]"。
Object.prototype.toString.call([val]) 基于call强制改变方法中的this是[val],就相当于在检测val的数据类型 <=> ({}).toString.call([val])
【 ({}).toString拿到 Object.prototype.toString。{} 可以是语句块,也可以是 对象字面量。】