typeof和instanceof實現原理

2021-09-24 07:27:10 字數 2895 閱讀 3099

不同的物件底層都表示為二進位制,其低位的 1-3 位用來儲存型別資訊,typeof 就是通過判斷前三位的機器碼來判定型別。判定規則如下:

有兩個值比較特殊:

以下是 typeof 的引擎**:

js_public_api(jstype)

js_typeofvalue(jscontext *cx, jsval v)

else if (jsval_is_object(v)) else

} else if (jsval_is_number(v)) else if (jsval_is_string(v)) else if (jsval_is_boolean(v))

return type;

}複製**

可以看到 typeof 首先判斷值是不是 undefined(通過值是不是等於 jsval_void(−2^30)來判斷)。

#define jsval_is_void(v)  ((v) == jsval_void)

複製**

當判斷為 object 型別後會作進一步判斷,如果可以呼叫 call 或者內部屬性[[class]]標記為函式則為函式,因此 typeof 可以判斷是不是函式。

clasp->call

clasp == &js_functionclass

複製**

對於 null,通過 jsval_is_object 判斷為 true 後,作進一步判斷,不是函式,因此為 object。

#define jsval_is_object(v)      (jsval_tag(v) == jsval_object)

複製**

typeof 只能判斷基本型別,此外還有乙個相容性較好的判斷型別的方法,即 objct.prototype.tostring 方法,如下:

object.prototype.tostring.call('xhm') // "[object string]"

object.prototype.tostring.call(1) // "[object number]"

object.prototype.tostring.call(true) // "[object boolean]"

object.prototype.tostring.call(undefined) // "[object undefined]"

object.prototype.tostring.call(null) // "[object null]"

object.prototype.tostring.call(symbol(1)) // "[object symbol]"

object.prototype.tostring.call() // "[object object]"

object.prototype.tostring.call(['a', 'b']) // "[object array]"

object.prototype.tostring.call(() => {}) // "[object function]"

複製**

instanceof 的用途為判斷物件 object 是否屬於某個型別,基本用法如下:

/*

object: 物件

constructor: 構造器

object instanceof constructor

*/const food = function() {};

const meat = new food();

meat instanceof food // true

複製**

由js 中的繼承與原型鏈一文我們可以知道,當建構函式在執行時會將返回物件的 prototype 賦值給例項物件的__proto__,因此可以通過判斷例項物件或其原型鏈中的__proto__是否等於建構函式的 prototype 來檢查物件的型別。其實現思路大致如下:

var newinstanceof = (obj, ctor) => 

objproto = objproto.__proto__;

}return false;

}newinstanceof(meat, food) // true

複製**

來看下面的例子:

var food = function() {};

var meat = function() {};

meat.prototype = new food();

var meat = new meat();

newinstanceof(meat, meat) // true

newinstanceof(meat, food) // true

meat instanceof meat // true

meat instanceof food // true

複製**

我們看到 meat instanceof food 為 true,因為 meat 在原型鏈上能夠找到 food,來看另乙個例子:

var meat = function() ;

};var meat = new meat();

newinstanceof(meat, meat); // false

meat instanceof meat // false

複製**

我們看到 meat instanceof meat 為 false,因為 instanceof 的本質是判斷原型鏈上的物件,而當乙個物件不是通過原型構造出來的例項時(meat 建構函式返回了乙個與 meat 毫不相干的物件),這種判定方法就會失效。

JS基礎之typeof和instanceof用法

在js中當不確定運算元的型別時,可以通過typeof 函式返回變數的型別。typeof 函式會把型別資訊當做字串返回,且typeof的返回值有六種情況,這六種返回值型別分別是 typeof的使用 舉例說明 console.log typeof null object console.log type...

database和instance的區別

database 資料庫,一組相關的物理檔案,比如資料檔案 日誌檔案和控制檔案等等,是物理上實實在在存在的,即使關閉資料庫仍然存在。instance 例項。記憶體和一些程序,比如sga 後台程序 windows系統是執行緒 當關閉資料庫後例項消失。兩者是相輔相成的,經常在一起使用。我們以常見的資料庫...

instance恢復概覽

instance恢復概覽 相關動態檢視 oracle 伺服器提供許多標準檢視以獲取有關資料庫和例程的資訊。這些檢視包括 v sga 查詢有關例程的以下各項的大小 共享池 日誌緩衝區 資料緩衝區快取記憶體以及固定記憶體大小 取決於作業系統 v instance 查詢例程的狀態,如例程模式 例程名 啟動...