实现一个JavaScript获取变量类型的方法
2019-12-18 13:54
951 查看
在JavaScript中要直接获取一个变量的类型,可能不会这么简单,比较熟悉的可能有typeof,instanceof,Object.prototype.toString.call,这几个方法各自有一些问题:
一个历史原因造成的bug,typeof null === 'object'
typeof对于其他非基本类型,都是直接返回object,typeof [1,2] === 'object'
typeof (new Date()) === "object"
instanceof 用来判断变量是否指定类的实例,比如 [1,2] instanceof Array === true,注意点是非基础类型都继承自object,也就是说非基本类型 instanceof Object === true
Object.prototype.toString.call也能拿到变量类型的字符串,通过正则提取对应的名字
Object.prototype.toString.call('sss') // [object String]
但是有个问题是,对于自定义的对象,Class返回的都是 [object Object]
好在通过自定义对象的构造函数名字,能拿到对象类型,所以,综合版的获取对象类型方法如下
function getTypeName( variable ) { if ( variable === null ) { return 'null'; } var t = typeof variable; switch( t ) { case 'object': case 'function': if ( variable.constructor ) { if ( variable.constructor.name ) { return variable.constructor.name; } else { //匿名函数 var funcStr = variable.constructor.toString(); // function name () {} var preg = /\s*function\s+([^\s\(]*)/; var match = funcStr.match( preg ); if ( match[ 1 ] ) { return match[ 1 ]; } } } else { var name = Object.prototype.toString.call( variable ); return name.match( /^\[object (.*+)\]$/ )[ 1 ]; } default: return t; } }