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 |
|
instanceof 操作符的实现原理
instanceof主要的作用是判断一个实例是否属于某种类型,也可以判断一个实例是否是其父类型或者祖先类型的实例。
instanceof 主要的实现原理就是只要右边变量的 prototype 在左边变量的原型链上即可。
因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false,告诉我们左边变量并非是右边变量的实例。
总结:
简单来说,我们使用 typeof 来判断基本数据类型是 ok 的,不过需要注意当用 typeof 来判断 null 类型时的问题,如果想要判断一个对象的具体类型可以考虑用 instanceof,但是 instanceof 也可能判断不准确,比如一个数组,他可以被 instanceof 判断为 Object。所以我们要想比较准确的判断对象实例的类型时,可以采取 Object.prototype.toString.call 方法。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!