摘要:但有些時候我們可能需要知道現在某個到底是否為運行時環境所原生支持,還是代碼支持的。今天在學習版本的源代碼時,就發現了中也有用來檢測一個函數是否為運行時原生支持。
在開發過程中,對于某些API在現有的JavaScript運行時環境不支持的時候,我們大都會采用加入polyfill來解決這個問題。但有些時候我們可能需要知道現在某個API到底是否為運行時環境所原生支持,還是polyfill代碼支持的。今天在學習Vue 2.X版本的源代碼時,就發現了Vue中也有用來檢測一個函數是否為運行時原生支持。
function isNative (Ctor) { return typeof Ctor === "function" && /native code/.test(Ctor.toString()) }
注意:上述代碼是我去除Vue中有關于(flow)類型聲明信息后所得
首先,檢測要被檢測者是否是函數類型,然后會檢測這個被檢測的函數toString之后的字符串中是否帶有native code字眼,如果符合這兩個條件,那么說明被檢測者是一個當前JavaScript運行時原生支持的函數。
有些人可能會問:為什么要檢測這個被檢測的函數toString之后的字符串中是否帶有native code字眼,為此我去看了ECMA-262最新規范,很遺憾我沒有找到依據,所以我只能退而求其次去看了MDN和MSDN,看看上面怎么說。
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)一章中是這么說的:
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()時,返回的也是:
"function functionname( ) { [native code] }"
結論:當一個對象為JavaScript運行時build-in object (內建對象),并且類型為Function類型時,對其調用toString()方法后,返回的結果字符串就是如下:
"function functionname( ) { [native code] }"
所以我們可以根據這一特性來得出如何去檢查一個函數是否為JavaScript運行時環境內建函數
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94032.html
摘要:語言中規定的類型為以及。這兩個值有不同的類型。內建類型定義了七種內建類型中新增提示以上類型,除的被稱為基本類型。新增列出的六種類型的值都會返回一個對應類型名稱的字符串。是中新增的數據類型,我們會在第三章詳細介紹。 譯者的前言 一直都想好好研究這個在 GitHub 上很有名氣的系列,而翻譯恰是最好的閱讀途徑之一。可以讓我閱讀的時候,不那么不求甚解。 圖靈社區出版了該系列兩部分的中文版——...
摘要:簡介項目命名為就是一個服務器單純開發一個服務器的想法,變成構建網絡應用的一個基本框架發展為一個強制不共享任何資源的單線程,單進程系統。單線程弱點無法利用多核錯誤會引起整個應用退出,應用的健壯性大量計算占用導致無法繼續調用異步。 NodeJs簡介 Ryan Dahl項目命名為:web.js 就是一個Web服務器.單純開發一個Web服務器的想法,變成構建網絡應用的一個基本框架.Node發展...
摘要:注意句柄棧并不是調用棧中的一部分,但句柄域卻在棧中。一個依賴于構造函數和析構函數來管理下層對象的生命周期。對象模板用來配置將這個函數作為構造函數而創建的對象。 如果你已經閱讀過了上手指南,那么你已經知道了如何作為一個單獨的虛擬機使用 V8 ,并且熟悉了一些 V8 中的關鍵概念,如句柄,域 和上下文。在本文檔中,還將繼續深入討論這些概念并且介紹其他一些在你的 C++ 應用中使用 V8 的...
摘要:當運行函數的時候,只能訪問自己的本地變量和全局變量,不能訪問構造器被調用生成的上下文的作用域。如何建立一個更安全一些的沙箱通過上文的探究,我們并沒有找到一個完美的方案在建立安全的隔離的沙箱。 showImg(https://segmentfault.com/img/remote/1460000014575992); 有哪些動態執行腳本的場景? 在一些應用中,我們希望給用戶提供插入自定義...
閱讀 1951·2021-09-07 10:24
閱讀 2086·2019-08-30 15:55
閱讀 2037·2019-08-30 15:43
閱讀 669·2019-08-29 15:25
閱讀 1044·2019-08-29 12:19
閱讀 1927·2019-08-23 18:32
閱讀 1515·2019-08-23 17:59
閱讀 946·2019-08-23 12:22