第一种 typeof , 例如:typeof 1 //Number 其中数组,null,都会判定为Object类型,因为数组是对象的一种特殊形式,它是由构造函数Array创建的,所以typeof会返回Object,但是null并不是这样null并不是对象,它是种原始数据类型,这是个历史遗留问题,因此typeof会返回object
第二种 instanceof 例如 2 instanceof Number //false [] instanceof Array //true instanceof可以正确判断引用数据类型,但是无法判断基本数据类型,其内部运行机制是判断右边的类型能否在左边值的原型链中查找到,或者说判断这个值的原型会不会指向右边的原型对象prototype,而存储在栈中的基本数据类型没有原型链,所以无法判断基本数据类型
第三种 cocnstructor 例如(2).constructor===Number //true constructor有两个作用,判断数据类型和对象实例通过constructor访问他的构造函数. 判断数据类型如果不改变他的原型就不会出错
第四种 Object.prototype.toString.call() tostring是object的原型方法,而array和function等类型作为object的实例,都重写了tostring方法,不同的对象类型调用tostring方法时,根据原型链的知识,调用的是对象的重写之后的tostring方法.而不是区调用object上原型tostring方法,所以要想要的单对象的具体类型时.应该调用object原型的tosting方法