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…我覺得好像還沒說清楚,等我再想想。。。
參考文章

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