正确检测Javascript数据类型

如何正确检测Javascript数据类型

typeof

对于任何变量来说,使用typeof 总是以字符串形式返回以下6种类型之一:

  • number
  • string
  • boolean
  • object
  • function
  • undefined

要注意 null 使用 typeof 检测时返回的是 ‘object’ 对于 null 可以使用

function type(o) {
  return (o === null) ? 'null' : typeof(o)
}

constructor(构造函数属性值)

使用 constructor 属性可以判断绝大部分数据的类型。

var a = 1; a.constructor // number
var a = {}; a.constructor // object
var a = []; a.constructor // array
var a = true; a.constructor // boolean
var a = 'true'; a.constructor // string
var a = function aaa(){}; a.constructor // function

但是对于 undefinednull 特殊值,不能能使用 constructor,会直接抛出异常。可以先转换布尔值,如果为 true,则说明不是 undefined 和null , 再调用 constructor属性

function type(o) {
  return !o ? o : (o).constructor
}

Object.prototype.toString

使用 toString() 方法检测对象类型是最安全、最准确的。它返回的字符串形式如下 [object class], 其中, object表示对象的通用类型,class表示对象的内部类型。

但是,要获取对象class值的唯一方法是必须调用 Object 对象定义的默认 toString() 方法,因为不同对象都会预定义自己的 toString() 方法,所以不能直接调用对象的 toString() 方法。 var a = new Date() a.toString() // 当前的UTC时间字符串

var a = new Date()
Object.prototype.toString.apply(a)

完善的检测方法

// 返回值有: 'undefined', 'null', 'number', 'boolean', 'object', 'function', 'regexp', 'string', 'array', 'date', 'error'
function typeOf(o) {
  var _toString =  Object.prototype.toString;
  var _type = {
    'undefined': 'undefined',
    'number': 'number',
    'boolean': 'boolean',
    'string': 'string',
    '[object Function]': 'function',
    '[object RegExp]': 'regexp',
    '[object Array]': 'array',
    '[object Date]': 'date',
    '[object Error]': 'error'
  }
  return _type[typeof o] || _type[_toString.call(o)] || (o ? 'object' : 'null')
}
0%