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复制代码