Rhino 引擎 JavaScript 语法支持范围
引擎概述
AutoJs6 使用 Mozilla Rhino 作为 JavaScript 脚本引擎。当前版本为 v2.0.0-SNAPSHOT(升级于 2025 年 12 月 25 日),相比原版 Auto.js 的 v1.7.7.2 有重大特性提升。
┌──────────────────────────────────────────┐
│ AutoJs6 脚本层 │
├──────────────────────────────────────────┤
│ v8+ 全局函数 (click, text, sleep...) │
├──────────────────────────────────────────┤
│ Rhino 2.0.0-SNAPSHOT (JS 引擎) │
├──────────────────────────────────────────┤
│ Android JVM (Java 互操作) │
└──────────────────────────────────────────┘
支持的 ES 特性
ES5 ✅ 全部支持
所有 ES5 标准特性均完整支持:
var声明function函数声明与表达式- 对象字面量、数组字面量
try-catch-finally异常处理for-in、for、while、do-while循环Array.prototype.forEach、map、filter、reduce等高阶方法JSON.parse/JSON.stringify
ES6 ⭐ 部分支持
| 特性 | 支持状态 | 示例 |
|---|---|---|
let / const | ✅ | let x = 1; const PI = 3.14; |
| 箭头函数 | ✅ | (x) => x * 2 |
| 模板字符串 | ✅ | ` Hello ${name} ` |
| 解构赋值 | ⚠️ 部分 | 对象解构 ✅ / 数组解构需测试 |
Object.values() | ✅ | Object.values({a: 1, b: 2}) |
Array.includes() | ✅ | [1, 2, NaN].includes(2) |
BigInt | ✅ | typeof 567n === 'bigint' |
for...of | ✅ | for (let item of items) {} |
| 默认参数 | ✅ | function test(a = 1) {} |
| 剩余参数 | ⚠️ 部分 | function test(...args) {} |
Promise | ⚠️ 需测试 | 建议用 callback 风格 |
async/await | ❌ 不支持 | 需用 Promise 链或回调 |
class | ⚠️ 部分 | 支持基础 class 语法 |
Symbol | ⚠️ 部分 | 基础 Symbol ✅ / 迭代器需测试 |
Proxy | ❌ 不支持 | Rhino 未实现 |
Map / Set | ⚠️ 需测试 | 基础用法需验证 |
| 扩展运算符 | ⚠️ 部分 | 对象扩展 ✅ |
Unicode 升级
Rhino 2.0.0-SNAPSHOT 升级后支持辅助平面字符的码位转义:
// 表示音乐符号 𝅘𝅥𝅮
'\u{1D160}';
// 传统写法: '\uD834\uDD60'
这使 emoji 和其他 BMP 外字符能正确处理。
正则表达式增强
v6.7 新增:
- 选择器正则表达式参数支持标志位(
i、m、s、u) - 支持后瞻断言语法(
(?=pattern)、(?!pattern)、(?<=pattern)、(?<!pattern))
// 选择器使用正则 + 忽略大小写标志
textMatches(/login/i).findOne();
// 后瞻断言
"price: ¥99".match(/(?<=¥)\d+/); // 匹配 "99"
与浏览器的差异
AutoJs6 在 Rhino 上运行,不是浏览器环境,以下特性不存在:
| 浏览器 API | AutoJs6 中 | 替代方案 |
|---|---|---|
window / document | ❌ 不存在 | 无替代(非浏览器) |
setTimeout / setInterval | ⚠️ 有但需测试 | 推荐用 setTimeout() 全局函数 |
XMLHttpRequest / fetch | ❌ 不存在 | 用 http 模块 |
localStorage | ❌ 不存在 | 用 storage 模块 |
console | ⚠️ 有但精简 | console.log() 可用,其他方法需测试 |
// 网络请求 — 不要用 fetch,用 http 模块
let response = http.get("https://api.example.com/data");
console.log(response.body.string());
Java 互操作
Rhino 的一大优势是可以直接调用 Java 类:
// 直接使用 Java 类
let file = new java.io.File("/sdcard/test.txt");
console.log(file.exists());
// 使用 Android API
let Intent = android.content.Intent;
let intent = new Intent();
intent.setClassName("com.android.settings", ".Settings");
版本兼容性建议
- 新项目默认使用
let/const/ 箭头函数 / 模板字符串等 ES6+ 特性 - 避免依赖
async/await、Proxy等不支持的特性 - 不确定是否支持时,直接写代码测试——Rhino 的报错信息通常很清晰
- 以官方最新版 Rhino 引擎行为为准,具体实现可能随版本调整