教你如何檢查一個函數是否爲JavaScript運行時環境內建函數

在開發過程當中,對於某些API在現有的JavaScript運行時環境不支持的時候,咱們大都會採用加入polyfill來解決這個問題。但有些時候咱們可能須要知道如今某個API究竟是否爲運行時環境所原生支持,仍是polyfill代碼支持的。今天在學習Vue 2.X版本的源代碼時,就發現了Vue中也有用來檢測一個函數是否爲運行時原生支持。
function isNative (Ctor) {
  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
}

注意:上述代碼是我去除Vue中有關於(flow)類型聲明信息後所得javascript

首先,檢測要被檢測者是不是函數類型,而後會檢測這個被檢測的函數toString以後的字符串中是否帶有native code字眼,若是符合這兩個條件,那麼說明被檢測者是一個當前JavaScript運行時原生支持的函數。
有些人可能會問:爲何要檢測這個被檢測的函數toString以後的字符串中是否帶有native code字眼,爲此我去看了ECMA-262最新規範,很遺憾我沒有找到依據,因此我只能退而求其次去看了MDN和MSDN,看看上面怎麼說。java

MDN上在關於Function.prototype.toString()一章上是這麼說的:函數

If the toString() method is called on built-in function objects or a function created by Function.prototype.bind, toString() returns a native function string which looks like
"function () {    [native code]   }"

義譯一下就是說:學習

若是 toString()方法是由 內建函數(即JavaScript自帶函數)或者是一個通過調用 Function.prototype.bind方法後返回的綁定了上下文的函數 所調用時,返回的結果就是
"function () {    [native code]   }"

微軟MSDN上關於toString Method (Object) (JavaScript)一章中是這麼說的:ui

The toString method is a member of all built-in JavaScript objects. How it behaves depends on the object type:
Object Behavior
Array Elements of an Array are converted to strings. The resulting strings are concatenated, separated by commas.
Boolean If the Boolean value is true, returns "true". Otherwise, returns "false".
Date Returns the textual representation of the date.
Error Returns a string containing the associated error message.
Function Returns a string of the following form, where functionname is the name of the function whose toString method was called:

function functionname( ) { [native code] }
Number Returns the textual representation of the number.
String Returns the value of the String object.
Default Returns "[object objectname]", where objectname is the name of the object type.

能夠看到在內建對象而且類型爲Function時,調用toString()時,返回的也是:prototype

"function functionname( ) { [native code] }"
結論:當一個對象爲JavaScript運行時 build-in object (內建對象),而且類型爲 Function類型時,對其調用 toString()方法後,返回的結果字符串就是以下:
"function functionname( ) { [native code] }"
因此咱們能夠根據這一特性來得出如何去檢查一個函數是否爲JavaScript運行時環境內建函數
相關文章
相關標籤/搜索