事情是这样的,typeof
可以正确判断除了null
之外的原始数据类型(typeof null === object
),instanceof
可以判断复杂数据类型,但是不能正确判断基本数据类型(为什么?因为instanceof操作不了,操作对象必须是某一个构造函数的实例,我们没法往后面放构造函数)。
先看一下typeof
能做的事情:
console.log(typeof undefined); // undefined
console.log(typeof 1); // number
console.log(typeof '1'); // string
console.log(typeof true); // boolean
console.log(typeof sym); // symbol
console.log(typeof null); // object
我们要完善一下,让instanceof
可以正确判断所有类型.
首先我们看一个小工具,这个叫做自定义instanceof
行为
MDN的解释:
class OriginNumber {
static [Symbol.hasInstance] (instance) {
return typeof instance === 'number'
}
}
console.log(1 instanceof OriginNumber) // true
这样可以让instanceof
正确判断number
类型的变量
其余原始类型的都一样
除了null
的
class OriginNull {
static [Symbol.hasInstance] (instance) {
return instance === null
}
}
console.log(null instanceof OriginNull) // true
由于复杂类型本来就可以判断 我们就不自己写了。
只是看一下结果:
console.log([] instanceof Array); // true
console.log(obj instanceof Object); // true
console.log(function foo() {
} instanceof Function); // true
console.log(function foo() {
} instanceof Object); // true
就先这样吧。手写instanceof
已经写在另一篇里面了。