跳转至

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()。

var selects = getParameterAsArray("_selects");
println("共选择了" + selects.length + "条记录!");

6. 判空与语言特性

  • 判空:v == null(同时覆盖 null / undefined)即可。
  • 可用现代 JS:const / let、箭头函数、模板字符串;旧示例的 var + function 仍可运行。

7. IIFE 硬规则(禁止顶层裸 return)

引擎按脚本正文求值;顶层 return 在 GraalVM JS 中非法(SyntaxError: Invalid return statement),常见表现是字段值脚本报错、表单内容区空白。

禁止 必须
return getWebUser().getId(); (function () { return getWebUser().getId(); })()
return true; / return ""; (function () { return true; })() / (function () { return ""; })()
// 错误 — 值脚本/隐藏脚本/校验脚本等切勿这样写
return getWebUser().getId();

// 正确
(function () {
  return getWebUser().getId();
})()

空字符串 ""(无脚本)除外。与 SKILL.md「通则 · IIFE 硬规则」一致。

速查对照

场景 错误 正确
脚本包装 裸 return …; (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