GraalVM JS 与 Rhino/Java 风格差异¶
运行时为 GraalVM JavaScript(非 Rhino)。字面量与 JS 值为原生 JS 类型;JS 属性优先于同名 Java 成员。编写/修改 iScript 时按本节,勿照搬旧 Java/Rhino 写法。
1. 字符串比较¶
| 禁止(Java/Rhino) | 改用(GraalVM JS) |
|---|---|
"x".equals(v) / "".equals(v) |
v === "x" / v === "" |
v.equals("x") |
v === "x" |
!"x".equals(v) / !v.equals("x") |
v !== "x" |
// 错误
if ("".equals(v)) { ... }
if ("02".equals(status)) { ... }
// 正确
if (v == null || v === "") { ... }
if (status === "02") { ... }
2. 字符串长度¶
JS 的 length 是**属性**,不是方法。在文档与示例中写作「禁止调用 .length()」。
| 禁止 | 改用 |
|---|---|
s.length() |
s.length |
s.trim().length() |
s.trim().length |
// 错误
if (v == null || v.trim().length() === 0) { ... }
// 正确
if (v == null || v.trim().length === 0) { ... }
例外:org.json.JSONArray 等 Java 类型仍用方法 jsonArray.length(),不要改成属性。
3. 其它 Java String 专用方法¶
对 JS 字符串字面量或已按 JS 处理的串,勿调用仅存在于 java.lang.String 的方法:
| 避免 | 改用 |
|---|---|
s.compareTo(t) |
s < t / s.localeCompare(t) |
依赖 Java 重载的 startsWith/endsWith 等 |
使用 JS 同名方法,或 indexOf / slice |
JS 本身也有的 trim / substring / indexOf / charAt 等一般可用。
4. 访问 Java 类¶
| 旧习惯 | 推荐 |
|---|---|
作用域直接写 java.util.HashMap |
Java.type('java.util.HashMap') |
importClass / importPackage / JavaImporter |
默认常不可用;改用 Java.type |
Packages.cn.myapps... |
多数环境仍可用(兼容);新建脚本优先 Java.type |
// 推荐
var HashMap = Java.type('java.util.HashMap');
var map = new HashMap();
// 兼容(现存示例常见)
var Security = new Packages.cn.myapps.common.util.Security();
5. Java 集合 vs JS 数组¶
| 类型 | 长度/遍历 |
|---|---|
java.util.List / Collection(平台 API 常见返回) |
.size()、.get(i)、.iterator() |
JS Array / getParameterAsArray 等 |
.length、下标 arr[i]、for |
勿对 Java List 用 .length;勿对 JS 数组用 .size()。
6. 判空与语言特性¶
- 判空:
v == null(同时覆盖null/undefined)即可。 - 可用现代 JS:
const/let、箭头函数、模板字符串;旧示例的var+function仍可运行。 - 默认包装仍建议:
(function () { ... return ...; })()。
速查对照¶
| 场景 | 错误 | 正确 |
|---|---|---|
| 相等 | "a".equals(b) |
b === "a" |
| 不等 | !b.equals("a") |
b !== "a" |
| 空串 | "".equals(v) |
v === "" |
| 长度 | v.length() |
v.length |
| 取类 | 裸 java.util.X / importClass |
Java.type('java.util.X') |
| List | list.length |
list.size() |
| JS 数组 | arr.size() / arr.length() |
arr.length |