数据类型的判断
- typeof
- instanceof
- Object.prototype.toString()
typeof
typeof
操作符来判断一个值属于哪种基本类型,返回值是一个string,对null判断有误,认为null是个空指针
typeof 'seymoe' // 'string'
typeof true // 'boolean'
typeof 10 // 'number'
typeof Symbol() // 'symbol'
typeof null // 'object'
无法判定是否为 null
typeof undefined // 'undefined'
如果使用 typeof 操作符对对象类型及其子类型,譬如函数(可调用对象)、数组(有序索引对象)等进行判定,则除了函数都会得到 object 的结果。
typeof {} // 'object'
typeof [] // 'object'
typeof(() => {})// 'function'
由于无法得知一个值到底是数组还是普通对象,显然通过 typeof 判断具体的对象子类型远远不够。
instanceof
通过 instanceof
操作符也可以对对象类型链上的构造函数进行判定,其原理就是测试构造函数的 prototype
是否出现在被检测对象的原型链上。
[] instanceof Array // true
({}) instanceof Object // true
(()=>{}) instanceof Function // true
注意:instanceof 也不是万能的。其原理就是测试构造函数
var a={}
a.__proto__=[]
a instanceof Array //true
a instanceof Object //true
Object.prototype.toString()
Object.prototype.toString()
可以说是判定 JavaScript 中数据类型的终极解决方法了,具体用法请看以下代码:
Object.prototype.toString.call({}) // '[object Object]'
Object.prototype.toString.call([]) // '[object Array]'
Object.prototype.toString.call(() => {}) // '[object Function]'
Object.prototype.toString.call('seymoe') // '[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(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
Object.prototype.toString.call(new Date()) // '[object Date]'
Object.prototype.toString.call(Math) // '[object Math]'
Object.prototype.toString.call(new Set()) // '[object Set]'
Object.prototype.toString.call(new WeakSet()) // '[object WeakSet]'
Object.prototype.toString.call(new Map()) // '[object Map]'
Object.prototype.toString.call(new WeakMap()) // '[object WeakMap]'