instanceof到底是怎样判断引用数据类型的!

拖延症。。。。得治啊!(才开始慢慢总结秋招中遇到的问题)


问题是这样的:

判断JavaScript数据类型的方法:(好了,那也就写一下咯)

  1. 最常见的:typeof判断,但是它的缺陷是,返回的类型都是字符串形式
  1. typeof null ===object,
  2. 它不能判断Array类型,判断出的数组类型是Object。
  1. 在已知是对象类型时:instanceof

那么,问题也就来了,instanceof到底是怎样判断的。

  1. 根据对象的constructor判断:constructor
  1. constructor 属性返回对创建此对象的数组,函数的引用。
  1. Object.prototype.toString.call()==='[object Array]'来进行判断。通用,但是很麻烦。

instanceof到底是怎样判断引用类型的。

第一反应是继承,但是我貌似是想多了。
看一段代码:

function A(){}
let a = new A()
console.log(a instanceof A)//true

很明显instanceof就是在判断一个实例是否属于某种类型
当然也很明了,instanceof就可以判断继承关系中用来判断一个实例十六否属于它的父类型。

function instance_of(L,R) {
    var o=R.prototype,
    L=L.__proto__
    while (true){
        if(L===null)return false
        if(o===L) return true
        L=L.__proto__
    }
}

所有 JavaScript 对象都有 proto 属性,但只有Object.prototype.proto 为 null,前提是没有在 Firefox 或者 Chrome 下修改过这个属性。这个属性指向它的原型对象。

ok,差不多了,我们继续。

ObjectL = Object, ObjectR = Object;
O = ObjectR.prototype = Object.prototype
L = ObjectL.__proto__ = Function.prototype
// 第一次判断
O !== L
L = Function.prototype.__proto__ = Object.prototype// 循环查找 L 是否还有 __proto__
// 第二次判断
O === L// 返回 true

em…我觉得好像还没说清楚,等我再想想。。。
参考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章