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,等我啥時候
開始搞基了我再通知你