数据类型检测
typeof
typeof是直接在计算机底层基于数据类型的值(二进制)进行检测的
typeof null "object",是由于对象存储在计算机中,都是以000开始的二进制存储的,而null也是,因此检测出来的null结果是"object",但null不是对象。
typeof 检测对象时,不管是普通对象/数组对象/正则对象/日期对象,都是“object”,检测函数也能检测出来,但是无法检测出具体的对象细分类别,而检测基本数据类型除了null之外都是可以的。
instanceof
检测当前实例是否属于这个类的
底层机制:只要当前类出现在实例的原型链上,结果都是true
问题:
- 由于我们可以肆意的修改原型的指向,所以检测出来的结果是不准的
- 不能检测基本数据类型
function instance_of(example,classFunc){
let p=classFunc.prototype
let q=Object.getPrototypeOf(example);//等价于example.__proto__,但这个example.__proto__一些浏览器不支持
while(true){
if(q===null){
//Object.prototype.__proto__结果是null
return false
}
if(q====p){
return true
}
q=Object.getPrototypeOf(q);
}
}
constructor
constructor用起来看似比instanceof还好用一些, (支持基本数据类型)
但是constructor可以说随便改,所以也不准。
Object.prototype.toString.call([value])
标准检测数据类型的方法:Object.prototype.toString不是转化为字符串,而是返回当前实例所属类的信息。
标准检测的方法 ,会返回
"[object Number/String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Function]"
let obj={name:"travis"}
obj.toString();=>得到"[object Object]"
//toString方法的执行,this是指向obj的,所以检测是obj它的所属类的信息
//推测:是不是只要把Object.prototype.toString执行,让它里面的this变为要检测的值,那就能返回当前值所属类的信息。