1、typeof
typeof操作符用来判断数据类型,返回的值为字符串,如下:
优点: 内置语法,使用便捷
缺点:使用typeof判断Array、obj、null返回的都是object,无法精确判断
2、instanceof()
instanceof操作符用来判断构造函数的prototype属性是否出现在对象的prototype链中的任何位置。返回值是一个布尔值
优点:判断某一对象的是不是另一对象的实例或当前对象的父类型
let a = [1,2,3]
a instanceof Array // true
缺点:不适合检测一个对象本身的类型
// 检测o是否为c的实例
function C() {}
function D() {}
let c = new C()
c instanceof C // true, because: Object.getPrototypeOf(c) === C.prototype
c instanceof D // false, because D.prototype is nowhere in c's prototype chain
instanceof Object // true, because: C.prototype instanceof Object
// 检测父类型
function C() {}
function D() {}
let c = new C()
D.prototype = c //继承原型
var d =new D()
console.log(d instanceof D); //true
console.log(d instanceof C); //true
// 不建议检测某一数据本身的类型
// 例: 检测true是否为Boolean
true instanceof Boolean // false
3、Object.prototype.toString()
通常我们使用Object.prototype.toString来判断数据类型都会加一个call来修改this指向,因为Object.prototype.toString判断的是Object.prototype的类型,所以需要call来修改作用域,将作用域改为toString后的实际的数据类型
Object.prototype.toString.call('1') // '[object String]'
Object.prototype.toString.call(1) // '[object Number]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call({}) // '[object Object]'
Object.prototype.toString.call([]) // '[object Array]'
优点: 能准确判断出数据类型
最全的判断数据类型的方法:
function getType(obj) {
if(typeof obj !== "object") {
return typeof obj
} else {
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}
}