1) typeof 检测数据类型运算符
console.log(typeof(10)) //Number
console.log(typeof(false)) //boolean
console.log(typeof('hello')) //string
console.log(typeof([])) // object
console.log(typeof(function(){})) //function
console.log(typeof({})) //object
console.log(typeof(undefined)) //undefined
console.log(typeof(null)) //object
2) instanceof 检测某个实例是否属于这个类,
不能正常判断基本类型
可以正确判断对象类型,内部运行机制是原型链上能否找到这个类型的原型。
console.log(100 instanceof Number) //false
console.log('100' instanceof String) //false
console.log(false instanceof Boolean) //false
console.log({} instanceof Object) //true
console.log(function(){} instanceof Function) //true
console.log([] instanceof Array) //true
console.log(/^$/ instanceof RegExp) //true
console.log(/^$/ instanceof Object) //true
前两种比较常用
3) constructor (检测实体和类的关系,从而检测数据基本类型--很少用)
和instanceof很相似,也能检测出是基本类型,数组,正则。
但constructor检测正则 === Object 检测不出
console.log((10).constructor === Number) //true
console.log(([]).constructor === Array) //true
console.log((function(){}).constructor === Function) //true
console.log(({}).constructor === Object) //true
console.log(/^$/.constructor === RegExp) //true
console.log(/^$/.constructor === Object) //false
4) Object.prototype.toString.call() 检测数据类型
获取Object原型上的toString方法,让方法执行,并且改变方法中this关键字指向。
let monitor = Object.prototype.toString;
console.log(monitor.call(1)) //[object Number]
console.log(monitor.call('hello')) //[object String]
console.log(monitor.call(null)) //[object null]
console.log(monitor.call(undefined)) //[object undefined]
console.log(monitor.call(function(){})) //[object Function]