typeof
对于原始类型,除了null都可以显示正确的类型
typrof null会输出object,这只是js存在的一个历史遗留bug
在js最初版本中用的是32位系统,为了性能考虑受使用低位存储变量的类型信息,000开头表示对象,然而null表示未全零,所以它被判断为object。现在内部类型判断代码已经改变了,但是这个bug依旧保留下来
1 | typeof 123 // 'number' |
但是对于对象来说,除了函数都显示为object,因此typeof并不能准确判断变量类型
1 | typeof [] // 'object' |
instanceof
想正确判断对象的正确类型,可以使用instanceof,因为内部机制是通过原型链来判断的
1 | const Father = function() {}; |
对于原始类型不能直接通过instanceof来判断类型,可以借助Symbol.hasInstance
Symbol.hasInstance 用于判断某对象是否为某构造器的实例。
例如,你可以这样来定义MyArray 的 instanceof 行为:
1 | class MyArray { |
类似地,通过Symbol.hasInstance对原始类型做类型判断
1 | class PrimitiveString { |
instanceof的实现原理
instanceof 可以正确的判断对象的类型,内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
因此,我们也可以试着实现一下instanceof
思路:
1.获取类型的原型
2.获取对象的原型
3.循环判断对象的原型是否等于类型的原型,直到对象原型为null,即原型链顶端null
1 | // left为对象,right为类型 |