代码:
function type(data) { let value = /\[object (\w+)]/.exec( Object.prototype.toString.call(data) ); return value ? value[1].toLowerCase() : ''; }执行结果:
解释:
(1)/\[object (\w+)]/.exec
正则表达式的匹配,其中前中括号 [ :表示中括号表达式的开始,属于特殊字符,要匹配它,需要转义,即加上 \;而后中括号 ] 不属于特殊字符,不必加转义字符
exec() 是一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回null)
例如:
var str="[object array]"; var reg= /\[object (\w+)]/ var res=reg.exec(str)返回的结果是:
["[object array]", "array", index: 0, input: "[object array]", groups: undefined]
(2) Object.prototype.toString.call(data)
toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....)
(3) return value ? value[1].toLowerCase() : ' '
为了精确起见,将exec返回的结果中我们需要的输出并且首字母转换成小写
这样短短几行就能精确判断数据类型。