数据类型检测
相信大家有的时候判断数据类型的时候会有疑惑 1、typeof、instanceof用的话会有哪些缺陷呢? 2、哪个api只要记住的话,就可以完美判断呢?
1、typeof
返回的都是字符串
type of Symbol() === 'symbol'
type of null === 'object'
type of [] === 'object'
type of {} === 'object'
type of console === 'object'
type of console.log === 'function'
undefined 为 'undefined' 可直接 typeof 判断
null 为 'object' 但并非引用类型 (null === null)
array 得另外加其他的判断条件
object 因为 null arrary 均是 object 所以也无法直接通过 typeof 去判断
function 可以直接通过 typeof 去判断
2、instanceof (instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。)
'111' instanceof String false
[] instanceof Array/Object true
111 instanceof Number false
new Date() instanceof Date/Object true
...
3、Object.prototype.toString.call()
Object.prototype.toString.call([]) ===> [object Array]
Object.prototype.toString.call('tutouwanglufei') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'tutouwanglufei'}) // "[object Object]"
...
总结:
1、instanceof可以准确的判断复杂引用数据类型,但是不能正确判断基础数据类型
2、而typeof也存在弊端,他虽然可以是判断基础数据类型(null除外),但是引用数据类型中,除了function类型除外,其他也无法判断
3、用Object.prototype.toString.call()就可以完美去判断某个变量属于什么类型