在开辟过程当中,关于某些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:
|
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运行时环境内建函数