typeof可用于判断基础类型,对付复杂类型判断为object,null值也判断为object。原因是由于typeof的判断原理是基于存储码来判断的。
js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息👉
- 000:对象
- 010:浮点数
- 100:字符串
- 110:布尔
- 1:整数
but, 对于 undefined
和 null
来说,这两个值的信息存储是有点特殊的。
null
:所有机器码均为0
undefined
:用 −2^30 整数来表示
所以,typeof
在判断 null
的时候就出现问题了,由于 null
的所有机器码均为0,因此直接被当做了对象来看待。
instanceOf可用于判断复杂类型或者基础类型。其判断原理是通过不断对比a的__proto__(隐式原型)和b的prototype(显示原型)是否相等对比,一旦相等返回为true,否则为false。
简单的实现:
function instanceof(a,b){
let left = a.__proto__;
let right = b.prototype;
while(true){
if(left === null){return false;}//已查到最后
else if(left === right){ return true;}
left = left.__proto__;//继续向上查找
}
}