js的数据类型分为两种,一种是简单数据类型,一种是复杂数据类型。
- 简单数据类型:Number,String,null,undefined,Boolean
- 复杂数据类型: Array,Object,Function
- 其他数据类型: RegExp,Json,Date,
在日常的研发场景中,比较常用三种判断数据的方法分别为typeof(),Object instanceof constructor,以及Object.prototype.toString.call()
typeof typeof()的使用场景为判断简单的数据类型,而复杂的数据类型则直接返回'object',由此可见其局限性,对于复杂类型的判断不适用
typeof(1) //'number'
const a = new Date()
typeof(a) //'object'
const c = [1,2,3,4]
typeof(c) //'object'
Object instanceof constructor
根据instanceof的定义:在检测对象的原型链上面查找构造函数的prototype属性是否出现,这个过程会沿着原型链一直找,直到找到原型链的最顶端Object.prototype还没找到,那就只能返回null了,说明该对象不是这个构造函数的实例.可见在使用instanceof判断数据类型时需知道数据的类型,才可以进行查找,且不能判断基础数据类型,会返回false
const a = '1111'
a instanceof String // false
const b = new Date()
b instanceof Date //true
const c = [1,2,3,5]
c instanceof Array // true
Object.prototype.toString.call() Object.prototype.toString.call()常用于自己封装组件,去判断数据类型,elementui中,数据类型就是用此判断
const a = [1,2,3,4,5]
Object.prototype.toString.call(a) //'[object Array]'
const b = {a:1}
Object.prototype.toString.call(b) //'[object Object]'
const c = new Date()
Object.prototype.toString.call(c) //'[object Date]'
异同点
异:
- typeof()判断不了复杂数组,
- Object instanceof constructor必须先知道数据类型,去判断该数据是否属于这个数据类型,且判断不了基本类型,
- Object.prototype.toString.call()基本类型和复杂类型都能判断,不能精准判断自定义对象,对于自定义对象只会返回[object Object],这个可以跟instanof进行互补。
同:都是判断数据的方法,具体使用场景视情况而定
const c = [1,2,3,4]
typeof(c) //'object'
c instanceof Array // true
Object.prototype.toString.call(a) //'[object Array]'