教你怎样搜检一个函数是不是为JavaScript运行时环境内建函数

在开辟过程当中,关于某些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:

ObjectBehavior
ArrayElements of an Array are converted to strings. The resulting strings are concatenated, separated by commas.
BooleanIf the Boolean value is true, returns “true“. Otherwise, returns “false“.
DateReturns the textual representation of the date.
ErrorReturns a string containing the associated error message.
FunctionReturns a string of the following form, where functionname is the name of the function whose toString method was called:

function functionname( ) { [native code] }

NumberReturns the textual representation of the number.
StringReturns the value of the String object.
DefaultReturns "[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运行时环境内建函数

    原文作者:而井
    原文地址: https://segmentfault.com/a/1190000014218703
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞