js数据类型分为基本数据类型和引用数据类型
基本数据类型
- number
- string
- boolean
- null
- undefined
- symbol (ES6)
引用数据类型
- function
- object
- [] 数组类型
- {} 对象类型
- /^$/ 正则类型
- Math 数学函数类型
- Date 日期类型
- ...
检测数据类型的四种方法
typeof :用来检测数据类型的运算符
typeof [value]
返回值:
- 返回值为字符串
- 返回的字符串包含对应的数据类型
根据上述使用可以得出结论:
缺点
- typeof null => "object"
- 不能具体区分对象数据类型的值,无法检测是正则还是数组 优点
- 使用方便,多用于检测基本数据类型(除null)
instanceof:用来检测实例是否隶属于某个类的运算符
[value] instanceof String
返回值:true/false
基本使用方式
实例使用方式 创建值的两种方式(不管哪种方式都是所属类的实例):
let n = 12; //字面量创建值
let m = new Number(12); //构造函数创建值
n与m的不同是,m是一个对象
根据上述使用可以得出结论:
缺点
- 不能处理基本数据类型值
- 只要在当前实例的原型链(_proto_)上出现过的类,检测结果都是true 优点
- 使用条件限制不高时,可以快速检测某个实例是否隶属于某个类
constructor:构造函数
[value].constructor == Number
返回值:true/false
根据上述使用可以得出结论:
缺点
- 实例的constructor太容易被修改了 优点
- 实例的constructor未被修改时,可以检测数据类型
object.prototype.toString.call()
object.prototype.toString.call([value])
返回值:"[object 所属类]" 例如:"[object Array]"
所有数据类型类的原型上都有toString方法,除了object的toString方法外,其他的toString都是将其转换成字符串;而Object原型上的toString是检测当前实例隶属类的详细信息
实现原理
obj.toString.call([value])
- 1.首先基于原型链查找机制,找到object.prototype.toString()
- 2.把找到的方法执行,方法中的this -> obj
- 3.call()方法执行,更换this -> [value]
- 4.方法内部this([value])所属类的信息输出
根据上述使用可以得出结论:
缺点
- 使用不便捷 优点
- 满足所有数据类型的检测
数据类型代码检测封装
let _obj = {
'isNumber' : 'Number',
'isString' : 'String',
'isBoolearn' : 'Boolearn',
'isNull' : 'Null',
'isUndefined' : 'Undefined',
'isSymbol' : 'Symbol',
'isFunction' : 'Function',
'isArray' : 'Array',
'isDate' : 'Date',
'isRegExp' : 'RegExp',
'isWindow' : 'Window'
},
_toString = Object.prototype.toString,
_type = {};
for(let key in _obj){
if(!_obj.hasOwnProperty(key)) break;
let _reg = new RegExp("\\[object "+_obj[key]+"\\]");
_type[key] = function func(_val){
return _reg.test(_toString.call(_val))
}
}
console.log(_type.isNumber(12)) //true