跳转至

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 仍可运行。
  • 默认包装仍建议:(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