如何精准的判断数据类型呢?
使用 Object.prototype.toString.call 方法
typeof 和 instanceof 的弊端
typeof 可以判断除了 null 以外的基本数据类型,但是判断引用类型时,除了 function 类型,其他的无法准确判断。
instanceof 可以准确地判断各种引用数据类型,但是不能正确判断基本数据类型。
Object.prototype.toString.call
//基本数据类型
Object.prototype.toString.call(0) // '[object Number]'
Object.prototype.toString.call('aaa') // '[object String]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
//引用数据类型
Object.prototype.toString.call({}) // '[object Object]'
Object.prototype.toString.call(function(){}) // "[object Function]'
Object.prototype.toString.call([1,2,3]) // '[object Array]'
为什么要调用call?
call 是函数的方法,用来改变 this 指向,用 apply 也可以
如果不改变this指向为我们的目标变量,this将永远指向调用的Object.prototype
例:
Object.prototype.toString([]) // '[object Object]' this 指向 Object.prototype,判断类型为 Object。
Object.prototype.toString.call([]) // '[object Array]' this 指向 [],判断类型为 Array