1、typeof,其中数组、对象、null都会被判断为object,其他判断都正确 2、instanceof可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。 instanceof只能正确判断引用数据类型,而不能判断基本数据类型。instanceof运算符可以用来测试一个对象其原型链中是否存在一个构造函数的prototype
console.log(2 instanceof Number) //false console.log({} instanceof Object) //true
3、constructor
constructor有两个作用,一是判断数据的类型,二是实例对象通过constructor对象访问它的构造函数
console.log((2).constructor === Number)// true console.log((function(){}).constructor === Fuction)// true console.log(({}).constructor === Object)// true 需要注意的是,如果创建一个对象来改变它的原型,constructor就不能通过constructor对象来判断数据类型了。如下: function Fn(){ Fn.prototype = new Array() var f = new Fn(); console.log(f.constructor === Fn) // false console.log(f.constructor === Array) // true } 4、Object.prototype.toString.call() Object.prototype.toString.call()使用Object对象的原型方法toString来判断数据类型
eg: let a = Object.prototype.toString console.log(a.call(2)) console.log(a.call([])) console.log(a.call({})) console.log(a.call(function(){})) 同样是检测对象的obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么? 这是因为toString是Object的原型方法,而Array、function等类型作为Object的实例,都重写了toString方法 不同的对象类型调用toString方法时,根据原型链的知识调用的是对应的重写之后的toString方法 (function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串...),而不会去调用object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obi转换为字符串类型,因此,在想要得到对象的具体类型时,应该调用object原型上的toString方法