检测数据类型

136 阅读2分钟

typeof value

  1. 返回值:是一个字符串,包含我们常见的数据类型
  2. 常见数据类型:"number"、"string"、"boolean"、"undefined"、"object"、"function"
  3. 测试
typeof 1                    // "number"
typeof '曾小白'             // "string"
typeof undefined            // "undefined"
typeof function(){}         // "function"
typeof []                   // "object"
typeof {}                   // "object"
typeof null                 // "object"因为null是一个空对象指针
  1. 综上可以看出,typeof不能具体的细分对象,数组,正则等,不管检测哪一个返回的都是"object"

instanceof

  1. 返回值:是一个布尔值true/false
  2. 原理:测当前实例是否属于某一个类
  3. 测试
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
  1. 综上可以看出,instanceof不能区分[]和{},因为都是Object这个基类的实例

constructor(只适用于对象、数组等复杂类型)

  1. 返回值:是一个布尔值true/false
  2. 原理:在类的原型上一般都会带有constructor属性,存储当前类本身,我们也是利用这一点,获取某类的实例constructor属性值,验证是否为所属的类,从而进行数据类型检测
  3. 测试
var a = []
a.constructor===Array   //true
a.constructor===Object   //false
a.constructor = {}
a.constructor = Object // 重新设置constructor属性
a.constructor===Object // true
  1. 综上可以看出,constructor属性值太容易被修改了,所以我们一般不使用

综合解决可以使用object.prototype.toString.call()

  1. 返回: "[object 当前数据类型所属的类型]"
  2. 原理:调用Object原型上的toString方法,让方法执行的时候,方法中的this是要检测的数据类型,从而获取到数据类型所属类的详细信息
  3. 测试
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]"
  1. 综上可见,能够清晰的看到属于什么类型

封装一个数据类型检测的方法库

// 判断一个数据类型的函数封装的方法,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"