typeof value
- 返回值:是一个字符串,包含我们常见的数据类型
- 常见数据类型:"number"、"string"、"boolean"、"undefined"、"object"、"function"
- 测试
typeof 1 // "number"
typeof '曾小白' // "string"
typeof undefined // "undefined"
typeof function(){} // "function"
typeof [] // "object"
typeof {} // "object"
typeof null // "object"因为null是一个空对象指针
- 综上可以看出,typeof不能具体的细分对象,数组,正则等,不管检测哪一个返回的都是"object"
instanceof
- 返回值:是一个布尔值true/false
- 原理:测当前实例是否属于某一个类
- 测试
var a = []
a instanceof Array // true
a instanceof RegExp // false
a instanceof Object // true
var b = {}
b instanceof Array // false
b instanceof RegExp // false
b instanceof Object // true
- 综上可以看出,instanceof不能区分[]和{},因为都是Object这个基类的实例
constructor(只适用于对象、数组等复杂类型)
- 返回值:是一个布尔值true/false
- 原理:在类的原型上一般都会带有constructor属性,存储当前类本身,我们也是利用这一点,获取某类的实例constructor属性值,验证是否为所属的类,从而进行数据类型检测
- 测试
var a = []
a.constructor===Array //true
a.constructor===Object //false
a.constructor = {}
a.constructor = Object // 重新设置constructor属性
a.constructor===Object // true
- 综上可以看出,constructor属性值太容易被修改了,所以我们一般不使用
综合解决可以使用object.prototype.toString.call()
- 返回: "[object 当前数据类型所属的类型]"
- 原理:调用Object原型上的toString方法,让方法执行的时候,方法中的this是要检测的数据类型,从而获取到数据类型所属类的详细信息
- 测试
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('曾小白') // "[object String]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(function(){}) // "[object Function]"
- 综上可见,能够清晰的看到属于什么类型
封装一个数据类型检测的方法库
// 判断一个数据类型的函数封装的方法,obj是用来接收传入的参数的
function gettype(obj) {
var type = typeof obj;
//如果不是object类型的数据,直接用typeof就能判断出来
if (type !== 'object') {
return type;
}
//如果是object类型数据,准确判断类型必须使用Object.prototype.toString.call(obj)的方式才能判断
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');
//正则主要是把第一个对象去掉
}
// 测试
gettype([]) // "Array"
gettype({}) // "Object"
gettype(null) // "Null"