JS分为基本类型和引用类型两大类;
基本类型:Number,String,Boolean,Undefined,Null,Symbol
引用类型:Object,Date,Function,Array,RegExp
检测数据类型的方法
1、typeof
typeof 1 // "number"
typeof '' // string
typeof true //boolean
typeof undefined //undefined
typeof Symbol() // symbol
typeof null //object
typeof new Date() //object
typeof new RegExp() //object
typeof [] //object
typeof {} //object
function fun(){}
typeof fun // function
typeof 对于基本类型中Number,String,Boolean,Undefined,Symbol和引用类型的Function可以检测出具体的数据类型,但是对于 Null,Array,Date,Object,RegExp统一识别成object
2、instanceof
instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。
newDate() instanceof Date;// true
new RegExp() instanceof RegExp // true
[] instanceof Array // true
{} instanceof Object // true
[] instanceof Object;// true
3、toString
toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(newFunction()) ; // [object Function]
Object.prototype.toString.call(newDate()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(newRegExp()) ; // [object RegExp]
Object.prototype.toString.call(newError()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
4、constructor
截屏2021-06-17 上午9.55.39.png
当执行 var f = new Fun() 时,Fun被当成了构造函数,f 是Fun的实例对象,此时 Fun 原型上的 constructor 传递到了 f 上,因此 f.constructor == Fun
截屏2021-06-17 上午9.57.08.png
可以看出,Fun 利用原型对象上的 constructor 引用了自身,当 Fun 作为构造函数来创建对象时,原型上的 constructor 就被遗传到了新创建的对象上, 从原型链角度讲,构造函数 Fun就是新对象的类型。这样做的意义是,让新对象在诞生以后,就具有可追溯的数据类型。
同样,JavaScript 中的内置对象在内部构建时也是这样做的:
截屏2021-06-17 上午10.32.23.png