JavaScript自我實現系列(1):instanceof

JavaScript判斷類型的三種方法

  1. typeofjavascript

  2. instanceofjava

  3. Object.prototype.toStringgit

typeof

使用:github

console.log(typeof 1024) // "number"

特殊狀況:prototype

// js自身的bug
console.log(typeof null) // "object"

侷限:code

// 不能明確是object類型的具體類型
console.log(typeof {}) // "object"
console.log(typeof []) // "object"

使用建議:遊戲

最好用typeof判斷基本類型ip

instanceof

使用:原型鏈

var arr = []
console.log(arr instanceof Array) // true
var now = new Date()
console.log(now instanceof Date) // true

使用建議:get

用來判斷一個實例是不是其父類型或祖先類型的實例

能夠結合typeof判斷數據的具體類型

自我實現

/*
*  instanceof的工做原理,就是判斷
*  右邊變量的prototype是否在左邊變量的原型鏈上。
*  
*  假如把prototype當作一個區域,
*  instanceof的工做原理,就是判斷
*  左邊變量是否能夠到達右邊變量所屬的這個區域。
*  
*  因此,咱們就能解鎖隱藏在instanceof裏面的彩蛋:
*  一個男孩找女孩的遊戲。
*/

function canBoyFind(boy, girl) {
    // girlRoom就是女孩的閨房
    var girlRoom = girl.prototype
    // room就是男孩如今所在的房間
    var room = boy.__proto__
    while (true){
        // 重複如下規則:
        // 1. 男孩一臉懵逼————本身居然在馬路上。遊戲直接結束!
        if (room === null){
            return false
        }
        // 2. 男孩就在女孩閨房,恭喜這對新人!
        if (room === girlRoom){
            return true
        }
        // 3. 男孩既不在馬路上,也不在女孩閨房裏。
        //    可是,這裏有一把鑰匙(__proto__),能夠通往下一個房間。
        //    男孩走進下一個房間...
        room = room.__proto__
    }
}

Object.prototype.toString

使用:

Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(null) // "[object Null]"

使用建議:

這麼好用,我先記下了

JavaScript自我實現系列 點擊查看

相關文章
相關標籤/搜索