支付宝小程序框架 事件·小程序的JavaScript引擎

2020-09-18 10:30 更新

运行引擎

小程序的 JavaScript 代码分为逻辑层脚本和 sjs 脚本,它们运行在相同的 JavaScript 引擎的不同线程中。

在不同操作系统上,小程序的 JavaScript 引擎是不同的。在 iOS 平台上,脚本运行在操作系统提供的 JavaScriptCore 引擎上;而在 Android 平台上,脚本则运行在支付宝提供的 V8 引擎上。

支付宝小程序通过对开发者上传的代码进行 babel 转换,使 JavaScript 引擎支持绝大多数 ES6 的新特性。但是对于 ES6 扩展的内置对象,小程序并未在 JavaScript 引擎上提供 polyfill,因此会导致在不同平台的 JavaScript 引擎中,对不同的 ES6 扩展的内置对象支持存在差异。

开发者需要避免使用 JavaScript 引擎不支持的内置对象。 如果必须使用,可自己提供内置对象的 polyfill(Polyfill :用于实现浏览器或其他 JavaScript 引擎不支持的原生 API 的代码 )。

注意:小程序引擎中禁止访问 globalThis、global ,因此无法直接使用 babel-polyfill

客户端操作系统对 ES6 扩展内置对象支持情况

下表是各个操作系统对 ES6 扩展的内置对象的支持情况:

Object iOS 8 iOS 9 iOS 10 及以上 Android
Object.is 不支持 支持 支持 支持
Object.assign 不支持 支持 支持 支持
Object.keys 支持 支持 支持 支持
Object.getOwnPropertyDescriptor 支持 支持 支持 支持
Object.getOwnPropertyNames 支持 支持 支持 支持
Object.getOwnPropertySymbols 不支持 支持 支持 支持

String iOS 8 iOS 9 iOS 10 及以上 Android
String.prototype.codePointAt 不支持 支持 支持 支持
String.prototype.normalize 不支持 不支持 支持 支持
String.prototype.includes 不支持 支持 支持 支持
String.prototype.startsWith 不支持 支持 支持 支持
String.prototype.endsWith 不支持 支持 支持 支持
String.prototype.repeat 不支持 支持 支持 支持
String.fromCodePoint 不支持 支持 支持 支持

Array iOS 8 iOS 9 iOS 10 及以上 Android
Array.prototype.copyWithin 不支持 支持 支持 支持
Array.prototype.find 支持 支持 支持 支持
Array.prototype.findIndex 支持 支持 支持 支持
Array.prototype.fill 支持 支持 支持 支持
Array.prototype.entries 支持 支持 支持 支持
Array.prototype.keys 支持 支持 支持 支持
Array.prototype.values 不支持 支持 支持 不支持
Array.prototype.includes 不支持 支持 支持 支持
Array.from 不支持 支持 支持 支持
Array.of 不支持 支持 支持 支持

Number iOS 8 iOS 9 iOS 10 及以上 Android
Number.isFinite 不支持 支持 支持 支持
Number.isNaN 不支持 支持 支持 支持
Number.parseInt 不支持 支持 支持 支持
Number.parseFloat 不支持 支持 支持 支持
Number.isInteger 不支持 支持 支持 支持
Number.EPSILON 不支持 支持 支持 支持
Number.isSafeInteger 不支持 支持 支持 支持

Math iOS 8 iOS 9 iOS 10 及以上 Android
Math.trunc 支持 支持 支持 支持
Math.sign 不支持 支持 支持 支持
Math.cbrt 支持 支持 支持 支持
Math.clz32 支持 支持 支持 支持
Math.imul 支持 支持 支持 支持
Math.fround 支持 支持 支持 支持
Math.hypot 支持 支持 支持 支持
Math.expm1 支持 支持 支持 支持
Math.log1p 支持 支持 支持 支持
Math.log10 支持 支持 支持 支持
Math.log2 支持 支持 支持 支持
Math.sinh 支持 支持 支持 支持
Math.cosh 支持 支持 支持 支持
Math.tanh 支持 支持 支持 支持
Math.asinh 支持 支持 支持 支持
Math.acosh 支持 支持 支持 支持
Math.atanh 支持 支持 支持 支持

内置对象 iOS 8 iOS 9 iOS 10及以上 Android
Set 支持 支持 支持 支持
Map 支持 支持 支持 支持
Proxy 不支持 不支持 支持 支持
Reflect 不支持 不支持 支持 支持
Promise 支持 支持 支持 支持

对动态执行脚本的限制

出于安全考虑,小程序限制了部分 ES 的语法和 API :

  • 不支持 eval 使用
  • setTimeout 和 setInterval 函数仅支持函数做回调参数,不可动态执行代码
  • 不支持使用 new Function 创建函数

模块名保留字

小程序的逻辑层支持 ES2015 模块化语法,但是将浏览器部分内置对象名(如 window、document)作保留字使用,以应对未来的不时之需,这些保留字不可用做模块名。保留字有:globalThis、global、AlipayJSBridge、fetch、self、window、document、location、XMLHttpRequest。更多详情请参见 框架概述 中对模块名保留字的介绍。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号