(来自90分钟让你掌握JavaScript中的数据类型检测原理)
JavaScript中提供了三种数据类型检测方法
typeof
/*
typeof:用来检测数据类型的运算符
用法:typeof [value]
@return
返回值是一个字符串,包含对应的数据类型,例如:'number'、'object'、'function'、'undefined'、'boolean'、'symbol'
@优点
使用方便,在真实项目中会大量使用,尤其是在检测基本数据类型(除null)和函数类型值时
@局限性
typeof null = 'object'
不能具体区分对象类型的值
typeof [] = 'object'
typeof /^$/ = 'object'
*/
// 应用
function func(n,m,callback){
typeof n === 'undefined' ? n = 0 : null
typeof callback === 'function' ? callback() : null
}
instanceof 和 constructor
/*
instanceof:本来是用于检测实例是否隶属于某个类,也可以用于做数据类型检测,比如数组和正则
@局限性
不能用于检测基本数据类型
只要在当前实例原型链出现过的类,结果都为true,并且用户可能会手动修改原型链的指向
constructor:构造函数
@局限性:constructor太容易被修改了
*/
console.log(1 instanceof Number) // false
Object.prototype.toString.call([value])
/*
原理:调用Object上的toString方法,方法执行时this是要检测的数据
@信息的模板:"[object 所属类]"
在所有数据类型类中,它们的原型上都有toString方法,除Object.prototype.toString外,其余的都是将数据值转化为字符串
Object.prototype.toString是检测当前实例隶属类的详细信息
*/
let _obj = {}
_obj.toString.call([value]) <=> Object.prototype.toString.call([value])
封装一个数据类型检测方法
let _obj = {
isNumber:'Number',
isBoolean:'Boolean',
isString:'String',
isNull:'Null',
isUndefined:'Undefined',
isSymbol:'Symbol',
isPlainObject:'Object',
isArray:'Array',
isRegExp:'RegExp',
isFunction:'Function',
isWindow:'Window'
},_toString = _obj.toString,_type = {}
for(let key in _obj){
if(!_obj.hasOwnProperty(key)){
break
}
let reg = new RegExp("\[object"+_obj[key]+"\]")
_type[key] = function anonymous(value){
return reg.test(_toString.call(value))
}
}