(1)typeof
其中数组、对象、null 都会被判断为 object,其他判断都正确。
(2)instanceof
instanceof 可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。
可以看到,instanceof 只能正确判断引用数据类型,而不能判断基 本数据类型。instanceof运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的
(3) constructor
constructor 有两个作用,一是判断数据的类型,二是对象实例通过 constrcutor 对象访问它的构造函数。需要注意,如果创建一个对象来改变它的原型,constructor 就不能用来判断数据类型了:
(4)Object.prototype.toString.call()
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 方法。