1 是否是数组
- typeof 检测数据类型运算符
优点:使用简单
缺点:只能检测基本类型(除null外)
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
- instanceof 检测某个实例是否属于这个类
优点:可以正确判断对象类型(引用类型),内部运行机制是原型链上能否找到这个类型的原型。
缺点:不能正常判断基本类型 并且 不能跨iframe
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
前两种比较常用
- constructor
优点:基本能检测所有类型(除了null和undefined)
缺点:constructor容易被修改,也不能跨iframe
和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
- Object.prototype.toString.call() 检测数据类型
优点:能检测出所有类型
缺点:在iE6下,undefined和null均为Obj
获取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]