Java Nashorn–Part 6

Nashorn 的 JavaScript 语言的伸张

正如我辈所谈论的,Nashorn 是一个完全符合 ECMAScript 5.1
的贯彻。可是除此之外,Nashorn 还落实了众多 JavaScript
语言的语法扩张,开发人士使用起来尤其有利于和易于。那个增添被 JavaScript
开发者所耳熟能详,并且相当多的人再次伸张的 JavaScript 的 Mozilla
的白话版本,让大家来看看多少个最广泛的立见成效的扩张。

Foreach 循环

业内的 JavaScript 并没有一样 Java 语言中的 foreach 循环,不过
Nashorn 达成了 Mozilla 方言版本的 foreach 循环体:

var jsEngs = [ "Nashorn", "Rhino", "V8", "IonMonkey", "Nitro" ];
for each (js in jsEngs) {
    print(js);
}

单纯效率的表达式

Nashorn
还帮忙另一个小的语法强化,假若一个函数(命名的或匿名的)只包蕴一个表明式,那么括号和重返语句可以简简单单。在底下的例子中,cube()
和cube2() 是完全一样的,但 cube() 经常是违法的
JavaScript 语法:

function cube(x) x*x*x;
function cube2(x) {
    return x*x*x;
}
print(cube(3));
print(cube2(3));

辅助五个 catch 子句

JavaScript 只帮忙简单的 try、catch 和 throw 的不得了处理。

注意:
在 JavaScrip t中,所有的极度都是 unchecked 类型的分外。

业内的 JavaScrip t只同意一个 catch 子句,不辅助处理分化品类非凡的 catch
子句。幸运的是,已经有一个共处的 Mozilla 的语法伸张提供那些效果,Nashorn
具有很好的帮助,如下所示:

function fnThatMightThrow() {
    if (Math.random() < 0.5) {
        throw new TypeError();
    } else {
        throw new Error();
    }
}

try {
    fnThatMightThrow();
} catch (e if e instanceof TypeError) {
    print("Caught TypeError");
} catch (e) {
    print("Caught some other error");
}

具体贯彻细节

我们在此以前琢磨过,Nashorn 直接编译 JavaScript 程序生成 JVM
字节码,然后似乎其余类一样运行它们。例如,lambda 表明式可以看成
JavaScript 函数简单明了的表现,以及它们之间的简易的操作性。
让大家看下往日的事例,来看一下是怎么用函数作为 Java 接口的匿名完结的。

jjs> var clz = Java.type("java.util.concurrent.Callable");
jjs> var obj = new clz(function () { print("Foo"); } );
jjs> print(obj);
jdk.nashorn.javaadapters.java.util.concurrent.Callable@290dbf45

那代表完毕 Callable 接口的切切实实贯彻的 JavaScript
对象的花色为jdk.nashorn.javaadapters.java.util.concurrent.Callable,这几个类并不是
Nashorn 附带的,反而,Nashorn
完成不管怎么的接口,动态转换成字节码,只须求维护原始的名字作为包结构的一局地,看起来更为富有可读性。

注意:
动态代码生成是 Nashorn 必备的局地,Nashorn 编译所有所有的JavaScript
代码生成 Java 字节码,但没有会分解代码。

由于 Nashorn 是一心遵从 ECMAScript
文档规范,所以有些时候完结的能力就会具有受限,像下边的事例,考虑打印出的对象是哪些:

jjs> var obj = {foo:"bar",cat:2};
jjs> print(obj);
[object Object]

ECMAScript 表达需要输出的结果为 [object
Object],而不允许提供更加多一蹴而就的细节(例如,obj 里颇具因素的性能和值)。