typeof
返回全部小写字符串,如:‘object’ ‘string’
typeof可以判断除了null以外的基本数据类型
typeof只能判断对象类型中的function,其它都为objecct
instanceof
A instanceof B 返回的是Boolean类型的值
B的prototype是否出现在A的原型链(proto)上
instanceof可以准确判断对象类型数据,但不能准确检测原始类型。
function myInstance(left, right) {
let bb = right.prototype;
left = left.__proto__;
while (true) {
if (left === null) { return false }
if (left === bb) { return true }
left = left.__proto__;
}
}
constructor:
原理:在类的原型上一般都会带有constructor属性,存储当前类本身,我们也是利用这一点,获取实例的constructor属性值,验证是否为所属的类,从而进行数据类型检测。
局限:
constructor属性值太容易被修改
console.log(12.constructor===Number); //true
除了null和undefined。constructor可以正确检测出原始类型和对象类型。
Object.prototype.toString.call(value);
调用Object原型上的toString方法,让方法执行的时候,方法中的this是要检测的数据类型。
在所有数据类型的类中,他们的原型上都有toString方法,除Object.prototype.toString不是把数据值转换为字符串,而是检测当前实例隶属类的详细信息的(检测数据类型)。其余的都是转为字符串,
1.通过原型链查找机制,找到Object.prototype.toString
2.把找到的方法执行,方法中的this->obj
3.方法内部把this(obj)的隶属类信息输出。=》方法执行,方法中的this是谁,就是检测谁的所属类信息。
可以检测所有数据类型。
封装一个检测数据类型的方法:
function getType(obj) {
let res = typeof obj;
if (res !== 'object') { return res }
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}