typeof
- 我们可以直接使用如下方法对变量进行判断
typeof 123 //number
typeof '123' //string
typeof [1,2,3] //Object
- typeof的局限性是无法准确判断原始类型的null, 对于对象来说,除了函数都会显示 object。
instanceof
- 我们可以使用如下方法来判断
var a = '123'
a instanceof String //false
var b = {}
b instanceof Object //true
- instanceof返回的结果是一个布尔值,true或者false。
- 用于判断某个变量是否是一个对象的实例,所以当我们使用的时候,Array可以被判断为数组和对象,因为数组也是对象的实例。
- 因为内部机制是通过原型链来判断的,所以无法直接判断原始对象,所以我们也可以通过以下方法来判断原始类型
class PrimitiveString {
static [Symbol.hasInstance](x) {
return typeof x === 'string'
}
}
console.log('aaa' instanceof PrimitiveString) // true
Symbol.hasInstance 其实就是一个能让我们自定义 instanceof 行为的东西,以上代码等同于 typeof ‘aaa’ === ‘string’
Object.prototype.toString.call()
- 我们可以通过如下的使用方法
Object.prototype.toString.call('123') //[object String]
Object.prototype.toString.call([]) //[object Array]
Object.prototype.toString.call(function(){}) //[object Function]
- 这个方法虽然繁琐,但是是最通用的方法,他可以精确判断出所有的数据类型。
借鉴掘金前端面试之道小册