当前位置: 首页 > Web前端 > HTML5

教你如何判断一个函数是否是JavaScript运行环境的内置函数

时间:2023-04-05 00:41:30 HTML5

在开发过程中,当一些API不被现有的JavaScript运行环境支持时,我们大多数人会使用polyfill来解决这个问题.但有时我们可能需要知道一个API是运行时环境原生支持还是polyfill代码支持。今天在研究Vue2.X版本的源码时,发现在运行时也使用了Vue来检测一个函数是否原生支持。functionisNative(Ctor){returntypeofCtor==='function'&&/nativecode/.test(Ctor.toString())}注:以上代码是我去掉Vue中的(流)类型声明信息后得到的首先检测被检测对象是否为函数类型,然后检测检测到的函数toString后面的字符串是否包含nativecode这个词。如果满足这两个条件,则意味着要检测的对象是当前JavaScript运行时原生支持的函数。可能有人会问:为什么我们要检测检测函数toString之后的字符串是否包含nativecode这个词呢?为此,我阅读了ECMA-262的最新规范。可惜我没有找到依据,只能退而求其次去MDN和MSDN看看他们是怎么说的。MDN在关于Function.prototype.toString()的章节中这样说:如果对内置函数对象或由Function.prototype.bind创建的函数调用toString()方法,toString()返回一个本地函数字符串,看起来like"function(){[nativecode]}"意思翻译过来就是:如果toString()方法是一个内置函数(也就是JavaScript自带的函数)或者是被Function.prototype.bind调用过的函数method当后面返回的context-bound函数被调用时,返回结果为“function(){[nativecode]}”MicrosoftMSDN在toStringMethod(Object)(JavaScript)一章中是这么说的:toStringmethodisamember所有内置的JavaScript对象。它的行为方式取决于对象类型:Array的ObjectBehaviorArrayElements被转换为字符串。将生成的字符串连接起来,用逗号分隔。布尔值如果布尔值为真,则返回“真”。否则,返回“false”。DateReturns日期的文本表示。ErrorReturns一个包含相关错误消息的字符串。FunctionReturns一个具有以下形式的字符串,其中functionname是名称of调用其toString方法的函数:functionfunctionname(){[nativecode]}Number返回数字的文本表示。String返回String对象的值。Default返回“[objectobjectname]”,其中objectname是对象类型。可以看到,当内置对象是Function类型时,调用toString()时,返回的也是:"functionfunctionname(){[nativecode]}"结论:当对象为JavaScript内置时runtime对象(内置对象),类型为Function类型,对其调用toString()方法后,返回结果字符串如下:"functionfunctionname(){[nativecode]}",所以我们可以使用此功能了解如何检查函数是否是JavaScript运行时环境的内置函数