instanceof 和 typeof 的实现原理

一. typeof 实现原理

typeof 一般被用于判断一个变量的类型,(适用于变量是js的基本数据类型时)我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型,这种判断能帮助我们搞定一些问题,比如在判断不是 object 类型的数据的时候,typeof能比较清楚的告诉我们具体是哪一类的类型。但是,typeof 在判断一个 object的数据的时候只能告诉我们这个数据是 object, 而不能细致的具体到是哪一种 object,如:

let s = new String('abc');
typeof s === 'object'// true
s instanceof String // true

instanceof 可以用来判断具体是哪一种 object 数据类型

注意(特殊点):

typeof null=='object'

二. Object.prototype.toString 是相对来说,判断的最准确的方法

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 也可以判断一个实例是否是其父类型或者祖先类型的实例。

let person = function () {
}
let nicole = new person()
nicole instanceof person // true


let person = function () {
}
let programmer = function () {
}
programmer.prototype = new person()
let nicole = new programmer()
nicole instanceof person // true
nicole instanceof programmer // true

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

四. 总结

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

具体原理还可参考这篇文章
https://juejin.cn/post/6844903613584654344#comment

你可能感兴趣的:(javascript,前端,es6)