1.typeof
typeof 是一个操作符,不是一个函数,所以后面的括号没有特定意义,返回的结果有:number、boolan、string、Object、undefined、function 等6种数据类型。
优点:对基本类型的判断较为准确。
缺点:无法精准判断引用数据类型。null 和 Array 判断为 ‘ Object ’。
console.log(typeof /\d/);//object
console.log(typeof {});//object
console.log(typeof []);//object
console.log(typeof (null));//object
console.log(typeof 123);//number
console.log(typeof true);//boolean
console.log(typeof function () {});//function
console.log(typeof (undefined));//undefined
2.instanceof
instanceof 判断一个对象和函数在原型链上是否有关系,有返回 true 否则为 false
优点:对引用类型的判断较为准确。
缺点:无法对基本类型做出精确地判断,限定了我们的数据类型必须是 new 出来的。这样才能精确的判断。
function b(){}
let a = new b;
console.log(a instanceof b);//true
console.log(b instanceof Object);//true
let arr = [1,2,3,4];
console.log(arr instanceof Array);//true
3.constructor
每个函数的定义,都会生成一个 constructor ,基本类型会隐式的执行装箱操作,创造一个构造函数的实例。
优点:对基本类型和引入类型都可以判断。
缺点:无法判断 null 和 undefined ,而且 constructor 是可以修改的,会导致检查结果不准确。
4.Object.prototype.toString.call ()(最好)
无论什么类型都可以判断,返回类型的格式为 [ Object xxx ] 。
在Object这个类的原型上有一个方法toString,但是这个方法并不是把值转换成字符串,而是返回当前值得所属类详细信息,固定结构:’[object 所属的类]'
总结:Object.prototype.toString执行的时候返回当前方法中的this的所属类信息,也就是,我想知道谁的所属类信息,我们就把这个toString方法执行,并且让this变为我们检测的这个数据值,那么方法返回的结果就是当前检测这个值得所属类信息
缺点:Object.prototype.toString 本身也可能被修改,对于数组的判断,可以通过 instanceof 和Object.prototype.toString.call()来判断。
Object.prototype.toString.call(12)//[boject Number]
Object.prototype.toString.call(true)//[boject Boolean]
//"[object Number]"
//"[object String]"
//"[object Object]"
//"[object Function]"
//"[object Undefined]"
//"[object Null]"
//"[object RegExp]"
//"[object Boolean]"
......