js数据类型分为基本数据类型和引用数据类型

基本数据类型

  • number
  • string
  • boolean
  • null
  • undefined
  • symbol (ES6)

引用数据类型

  • function
  • object
    • [] 数组类型
    • {} 对象类型
    • /^$/ 正则类型
    • Math 数学函数类型
    • Date 日期类型
    • ...
检测数据类型的四种方法

typeof :用来检测数据类型的运算符

typeof [value]复制代码

返回值:

  • 返回值为字符串
  • 返回的字符串包含对应的数据类型

js数据类型检测的方法与区别_js数据类型

根据上述使用可以得出结论:

缺点

  • typeof null => "object"
  • 不能具体区分对象数据类型的值,无法检测是正则还是数组

优点

  • 使用方便,多用于检测基本数据类型(除null)

instanceof:用来检测实例是否隶属于某个类的运算符

[value] instanceof String复制代码

返回值:true/false

基本使用方式

js数据类型检测的方法与区别_js数据类型_02

实例使用方式

创建值的两种方式(不管哪种方式都是所属类的实例):

let n = 12; //字面量创建值let m = new Number(12); //构造函数创建值复制代码

js数据类型检测的方法与区别_js数据类型_03

n与m的不同是,m是一个对象

根据上述使用可以得出结论:

缺点

  • 不能处理基本数据类型值
  • 只要在当前实例的原型链(_proto_)上出现过的类,检测结果都是true

优点

  • 使用条件限制不高时,可以快速检测某个实例是否隶属于某个类

constructor:构造函数

[value].constructor == Number复制代码

返回值:true/false

js数据类型检测的方法与区别_js数据类型_04

根据上述使用可以得出结论:

缺点

  • 实例的constructor太容易被修改了

优点

  • 实例的constructor未被修改时,可以检测数据类型

object.prototype.toString.call()

object.prototype.toString.call([value])复制代码

返回值:"[object 所属类]"   例如:"[object Array]"

js数据类型检测的方法与区别_js数据类型_05

所有数据类型类的原型上都有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复制代码