instanceof、typeof

typeof实现原理

typeof用于判断变量的类型,可以判断number、string、object、undefined、function、boolean、symbol 这7种类型,判断不是object类型的时候可以比较清楚的告诉我们具体是哪一类,但不能明确告诉我们object是哪一种。
由于js底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息。

  • 000:对象
  • 010:浮点数
  • 100:字符串
  • 110:布尔
  • 1:整数

对于null和undefined比较特殊,
undefined: 用 −2^30 整数来表示
null:所以机器码都为0,因此通过typeof判断时候会被当作object
使用instanceof判断的话,null直接判断为不是object。
因此在使用typeof判断变量类型的时候,最好用来判断基本数据类型(包括symbol),避免对null的判断

还有一个不错的判断类型的方法,Object.prototype.toString,可以利用这个方法来对一个变量类型来进行比较准确的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Object.prototype.toString.call(1) // "[object Number]"

Object.prototype.toString.call('hi') // "[object String]"

Object.prototype.toString.call({a:'hi'}) // "[object Object]"

Object.prototype.toString.call([1,'a']) // "[object Array]"

Object.prototype.toString.call(true) // "[object Boolean]"

Object.prototype.toString.call(() => {}) // "[object Function]"

Object.prototype.toString.call(null) // "[object Null]"

Object.prototype.toString.call(undefined) // "[object Undefined]"

Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"

instanceof 操作符的实现原理

instanceof主要的作用是判断一个实例是否属于某种类型,也可以判断一个实例是否是其父类型或者祖先类型的实例。

instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。

因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false,告诉我们左边变量并非是右边变量的实例。

总结:
简单来说,我们使用 typeof 来判断基本数据类型是 ok 的,不过需要注意当用 typeof 来判断 null 类型时的问题,如果想要判断一个对象的具体类型可以考虑用 instanceof,但是 instanceof 也可能判断不准确,比如一个数组,他可以被 instanceof 判断为 Object。所以我们要想比较准确的判断对象实例的类型时,可以采取 Object.prototype.toString.call 方法。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!