1,typeof XXX
2,instanceof
3,constructor
4,Object.prototype.toString.call()
(1)typeof XXX
数组、对象、null 都会被判断为object,其他判断都正确。

(2)instanceof
instanceof 可以正确判断对象的类型,其内部运行机制:判断在其原型链中能否找到该类型的原型。
instanceof 只能正确判断引用数据类型,而不能判断基本数据类型
instanceof 运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype 属性。

(3) constructor
constructor 有两个作用,一是判断数据的类型,二是对象实例通过constrcutor 对象访问它的构造函数。
需要注意,如果创建一个对象来改变它的原型,constructor 就不能用来判断数据类型了

constructor判断数据的类型

(4)Object.prototype.toString.call()
使用Object 对象的原型方法toString 来判断数据类型
同样是检测对象obj 调用toString 方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?
答:
这是因为toString 是Object 的原型方法,
而Array、function 等类型作为Object 的实例,都重写了toString 方法。
不同的对象类型调用toString 方法时,根据原型链的知识,调用的是对应的重写之后的toString 方法
(function 类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…),而不会去调用Object 上原型toString 方法(返回对象的具体类型),
所以采用obj.toString()不能得到其对象类型,只能将obj 转换为字符串类型;
因此,在想要得到对象的具体类型时,应该调用Object 原型上的toString 方法。
