js-数据类型检测

38 阅读1分钟

数据类型检测

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变为要检测的值,那就能返回当前值所属类的信息。