JS判断数据类型的四种方式

271 阅读2分钟

JS判断数据类型的四种方式

ECMAScript中数据类型分为两大类(基本类型,引用类型),7种数据类型

基本类型:占用空间固定,被存放在了栈中

引用类型:数据结构复杂,中存放引用类型的引用地址,引用地址指向中真正的存放对象

  • 基本类型:Number,String,Boolean,Null,Undefined,Symbol
  • 引用类型:Object(Function,Array,RegExp,Date...)

1.typeof判断数据类型

  • 基本类型:typeof不能判断null,因为返回的是object
  • 引用类型:除了function可以判断,其他的都返回object
console.log(typeof 1);//=>number
console.log(typeof '1');//=>string
console.log(typeof true);//=>boolean
console.log(typeof null);//=>object
console.log(typeof undefined);//=>undefined
console.log(typeof Symbol());//=>symbol
console.log(typeof Function());//=>function
console.log(typeof []);//=>object
console.log(typeof /\.jpg/);//=>object
console.log(typeof new Date());//=>object

2.instanceof判断数据类型

instanceof检测的是原型,如:a instanceof A,检测的是a是不是A的实例

console.log(new Number(1) instanceof Number);//=>true
console.log(new String('1') instanceof String);//=>true
console.log(new Boolean(true) instanceof Boolean);//=>true

function Person(){}
const p=new Person
console.log(p instanceof Person )//=>true

console.log([] instanceof Array);//=>true

const date=new Date
console.log(date instanceof Date);//=>true

console.log(/\.jpg/ instanceof RegExp);//=>true

==注意:==

function Person(){}
const p=new Person
console.log(p instanceof Object )//=>true

console.log([] instanceof Object);//=>true

const date=new Date
console.log(date instanceof Object);//=>true

console.log(/\.jpg/ instanceof Object);//=>true

可以看出这几个引用对象实例也是Object的实例,这是为什么呢?以数组为例分析

[].__proto__-->Array.prototype-->Array.prototype.__proto__-->Object.prototype-->Object.prototype.__proto__-->null

3.constructor判断数据类型

  • 当函数被定义时,浏览器引擎会为函数添加一个prototype原型,prototype上有一个constructor属性指向函数本身;
  • new函数(函数被当成构造函数执行),如:const fn=new Fn,此时fn.__proto__==Fn.prototype指向同一个地址,因此fn.constructor===Fn
function Fn(){}
const fn=new Fn;
console.log(fn.__proto__===Fn.prototype);//=>true
console.log(fn.constructor===Fn);//=>true
  • 类型判断
console.log(new Number(1).constructor===Number);//=>true
console.log(''.constructor===String);//=>true
console.log(true.constructor===Boolean);//=>true
console.log(new Function().constructor===Function);//=>true
console.log(new Date().constructor===Date);//=>true
console.log(new RegExp().constructor===RegExp);//=>true

==注意:==

  • nullundefined是无效对象,没有constructor
  • constructor判断是需要注意prototype有没有被重写,如果被重写了引用地址会改变
function Fn(){}
Fn.prototype={};
const fn=new Fn;
console.log(fn.constuctor===Fn);//=>false

4.toString判断数据类型

toStringObject的原型方法,返回值为[object xxx]

console.log(Object.prototype.toString.call(1));//=>[object Number]
console.log(Object.prototype.toString.call('1'));//=>[object String]
console.log(Object.prototype.toString.call(true));//=>[object Boolean]
console.log(Object.prototype.toString.call(null));//=>[object Null]
console.log(Object.prototype.toString.call(undefined));//=>[object Undefined]
console.log(Object.prototype.toString.call(Symbol()));//=>[object Symbol]
console.log(Object.prototype.toString.call({}));//=>[object Object]
console.log(Object.prototype.toString.call([]));//=>[object Array]
console.log(Object.prototype.toString.call(new Function()));//=>[object Function]
console.log(Object.prototype.toString.call(new Date()));//=>[object Date]
console.log(Object.prototype.toString.call(new RegExp()));//=>[object RegExp]

5.实现一个判断数据类型的通用方法

function checkType(type) {
    return (content) => {
        return Object.prototype.toString.call(content) === `[object ${type}]`
    }
}

let utilsType = {}
const types = ['Number', 'Boolean', 'String', 'Object', 'Array','Symbol','RegExp','Null','Undefined'];
types.forEach(type => {
    utilsType[`is${type}`] = checkType(type);
})
console.log(utilsType.isNumber(1));
console.log(utilsType.isBoolean(true));
console.log(utilsType.isString('1'));
console.log(utilsType.isObject({ name: 1 }));
console.log(utilsType.isArray([1, 2]));
console.log(utilsType.isSymbol(Symbol()));
console.log(utilsType.isRegExp(new RegExp()));
console.log(utilsType.isNull(null));
console.log(utilsType.isUndefined(undefined));