toString返回的[native code]

a30c71652909e67959e218ef463c7912.png

在开发过程中,对于某些API在现有的JavaScript运行时环境不支持的时候,我们大都会采用加入polyfill来解决这个问题。但有些时候我们可能需要知道现在某个API到底是否为运行时环境所原生支持,还是polyfill代码支持的。今天在学习Vue 2.X版本的源代码时,就发现了Vue中也有用来检测一个函数是否为运行时原生支持。

function isNative (Ctor) {
  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
}

首先,检测要被检测者是否是函数类型,然后会检测这个被检测的函数toString之后的字符串中是否带有native code字眼,如果符合这两个条件,那么说明被检测者是一个当前JavaScript运行时原生支持的函数。

有些人可能会问:为什么要检测这个被检测的函数toString之后的字符串中是否带有native code字眼,当一个对象为JavaScript运行时build-in object (内建对象),并且类型为Function类型时,对其调用toString()方法后,返回的结果字符串就是如下:

"function functionname( ) { [native code] }"

所以我们可以根据这一特性来得出如何去检查一个函数是否为JavaScript运行时环境内建函数。

如 Proxy, Promise, Map, Symbol, Reflect等原生方法,在浏览器中的支持情况都可以用这个函数检测

// 判断浏览器是否支持某一方法
 function isNative(Ctor) {
     return typeof Ctor === 'function' && /native code/.test(Ctor.toString());
 }
 console.log(isNative(Proxy)) // true
 console.log(isNative(Promise)) // true
 console.log(isNative(Map)) // true
 console.log(Proxy.toString()) // function Proxy() { [native code] }
 console.log(Promise.toString()) // function Promise() { [native code] }
 console.log(Map.toString()) // function Map() { [native code] }

对于 Vue.js 的 nextTick 方法,判断是否原生支持 Promise 的目的是为了选择最佳的异步任务调度机制。尽管可以使用 Promise 的 polyfill 来提供对 Promise 的支持,但在某些情况下,原生的 Promise 实现可能会提供更好的性能和可靠性。

原生的 Promise 实现通常是由 JavaScript 引擎提供的,并且经过优化以适应特定的环境和平台。它们通常会利用底层的异步任务调度机制(例如微任务队列)来实现更高效的异步操作。另外,原生的 Promise 实现在不同的浏览器和环境中行为一致,这有助于提供更可靠的跨平台支持。

使用 Promise 的 polyfill 可以在不支持原生 Promise 的环境中提供基本的 Promise 功能,但它可能无法完全模拟原生 Promise 的行为和性能。此外,polyfill 的实现可能会增加额外的代码和复杂性,并且在某些情况下可能存在性能上的损失。

因此,为了提供最佳的性能和可靠性,Vue.js 在 nextTick 方法中首先检查是否原生支持 Promise,如果支持,则使用原生的 Promise 实现进行异步任务调度。只有在不支持原生 Promise 的情况下,才会回退到使用其他的异步任务调度机制。

这种判断是为了优化 Vue.js 在不同环境下的性能和可靠性,以提供最佳的用户体验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在JavaScript中,可以通过以下方法来判断一个方法是内置的还是自定义的: 1. 使用typeof操作符:如果函数是内置的,typeof操作符将返回"function"。如果函数是自定义的,typeof操作符将返回"undefined"。 2. 使用toString()方法:内置函数的toString()方法将返回一个字符串,其中包含"[native code]",而自定义函数的toString()方法将返回函数的源代码字符串。 例如: ```javascript function myFunc() { console.log("This is a custom function."); } console.log(typeof Math.sqrt); // "function" console.log(typeof myFunc); // "function" console.log(Math.sqrt.toString().indexOf("[native code]") !== -1); // true console.log(myFunc.toString().indexOf("[native code]") !== -1); // false ``` 在上面的示例中,我们使用typeof操作符来检查Math.sqrt和myFunc函数的类型。然后,我们使用toString()方法来检查这些函数是否是内置的。 ### 回答2: 要判断一个JavaScript方法是内置的还是自定义的,可以通过以下方法进行判断: 1. 通过方法是否存在于内置对象中来判断。JavaScript提供了一系列内置对象,如Array、Date、Math等,这些对象具有一些内置的方法。如果要判断的方法存在于这些内置对象中,那么可以认为它是内置的。例如,我们可以通过判断一个方法是否存在于Array.prototype对象中来确定它是否是内置的。 2. 查找方法的定义位置。使用浏览器的开发者工具或者一些在线调试工具,在调试模式下可以查看到方法的定义位置。如果方法的定义位置是JavaScript的内置代码库中,那么可以认为它是内置的。 3. 查阅官方文档。JavaScript有官方的文档,如MDN(Mozilla Developer Network)提供了详细的JavaScript API文档。如果在文档中找到了要判断的方法,那么可以确认它是内置的。 4. 检查方法的实现逻辑。查看方法的具体实现逻辑,如果涉及一些底层的操作或者使用了一些特殊的语言特性,可以认为它是内置的。 需要注意的是,以上方法只能做出推测,不能完全确定一个方法是否是内置的。有些自定义的方法可能与内置的方法具有相同的名称和功能,而且有些内置方法可能在不同的JavaScript引擎中的实现稍有差异。 ### 回答3: 要判断一个 JavaScript 的方法是内置的还是自定义的,可以通过以下方法进行判断。 首先,我们可以查看该方法是否存在于 JavaScript 的内置对象中。JavaScript 提供了一些内置对象,如 Math、Array、String 等,这些对象下面包含了许多内置的方法。如果我们找到了这个方法并且它是某个内置对象的属性,那么我们可以判断它是一个内置方法。 其次,如果这个方法不是内置对象的属性,我们可以在当前的 JavaScript 文件或者代码块的作用域中搜索该方法名。通过查看该作用域的代码,我们可以判断这个方法是否是在当前的文件或代码块中自定义的。 另外,我们还可以通过判断该方法的类型来确定它是内置的还是自定义的。内置方法通常属于 JavaScript 的基本数据类型,如 字符串、数组、数值等等,它们的类型通常是 Function。而自定义的方法可以是由开发者定义的任意类型,如 Object、Function 等。 最后,如果以上方法都无法判断该方法的类型,我们可以使用一些工具或者在线网站来帮助我们判断。这些工具可以提供一些关于该方法的详细信息,包括它是内置的还是自定义的。 总结来说,要判断一个 JavaScript 的方法是内置的还是自定义的,我们可以通过查找该方法是否存在于内置对象中、搜索当前的代码块来查找自定义方法、判断方法的类型以及使用一些工具和网站来辅助判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值