在開發過程當中,對於某些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 thetoString()
method is called onbuilt-in
function objects or a function created byFunction.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運行時環境內建函數