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

445 阅读2分钟

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