1. 程式人生 > >instanceof和typeof的細節

instanceof和typeof的細節

  我騎著小毛驢,喝著大紅牛哇,哩個啷格里格朗,別問我為什麼這木開心,如果活著不是為了浪蕩那將毫無意義

  今天來捋一捋我們平日經常用的instanceof和typeof的一些小問題

  typeof:

    typeof裡面是由一個小坑的  我們今天著重來研究一下這個小坑

    假設現在問一個問題          typeof(null) 結果為啥  可能你會覺得他是null   或者是Object ,可能有的同學會說那當然是null了

    其實正確答案是Object,那你知道為什麼結果是Object嗎,看到這你可能覺得你怎麼這木囉嗦,不是我囉嗦,是因為學習嘛,不刨根問底就沒意思了

    下面我們來說說原因:因為在 JS 的最初版本中,使用的是 32 位系統,為了效能考慮使用低位儲存了變數的型別資訊,000 開頭代表是物件,然而 null 表示為全零,所以將它錯誤的判斷為 object 。                    雖然現在的內部型別判斷程式碼已經改變了,但是對於這個 Bug 卻是一直流傳下來

    在 ES6 中曾有關於修復此 bug 的提議,提議中稱應該讓 typeof null === 'null',但是該提議被無情的否決了,自此 typeof null 終於不再是一個 bug,而                 是一個 feature,並且永遠不會被                 修復。

    下面是我從網上找的第一版javascript 實現中,判斷型別的程式碼是這麼寫的:

    能看懂就看看,看不懂也無所謂,反正我也看不懂

if (JSVAL_IS_VOID(v)) {  // (1)
    type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) {  // (2)
    obj = JSVAL_TO_OBJECT(v);
    if (obj &&
        (ops = obj->map->ops,
            ops == &js_ObjectOps
            
? (clasp = OBJ_GET_CLASS(cx, obj), clasp->call || clasp == &js_FunctionClass) // (3,4) : ops->call != 0)) { // (3) type = JSTYPE_FUNCTION; } else { type = JSTYPE_OBJECT; } } else if (JSVAL_IS_NUMBER(v)) { type = JSTYPE_NUMBER; } else if (JSVAL_IS_STRING(v)) { type = JSTYPE_STRING; } else if (JSVAL_IS_BOOLEAN(v)) { type = JSTYPE_BOOLEAN; }

    instanceof

      下面我們來說一說instanceof,今天我們著重來看一看實現原理

      instanceof的實現原理是通過判斷物件的原型鏈中是不是能找到型別的 prototype

      下面我們自己來寫一個類似於instanceof的函式

      

function instanceof(left, right) {
    // 獲得型別的原型
    let prototype = right.prototype
    // 獲得物件的原型
    left = left.__proto__
    // 判斷物件的型別是否等於型別的原型
    while (true) {
        if (left === null)
            return false
        if (prototype === left)
            return true
        left = left.__proto__
    }
}

      這木無趣的文章你竟然能看到這裡,說,是不是對我有意思?要是你是女孩子,請聯絡我好吧,我這代養十八至二十五週歲的適齡女孩子,什麼你是男的,那看完抓緊時間gun,等我啥時候

  開始搞基了我再通知你