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 里所有元素的属性和值)。

Java Nashorn--Part 6的更多相关文章

  1. Java 7 可执行的 Nashorn,取代 Rhino

    惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都能够使用.源代码在 https://bitbucket.org/ramonza/nashorn-backport ...

  2. Learning Java 8 Syntax (Java in a Nutshell 6th)

    Java is using Unicode set Java is case sensitive Comments, C/C++ style abstract, const, final, int, ...

  3. Atitit。Js调用后台语言 java c#  php swing android  swt的方法大总结

    Atitit.Js调用后台语言 java c#  php swing android  swt的方法大总结 1. Js调用后台语言有三种方法1 2. Swt  BrowserFunction 绑定方法 ...

  4. JS代码检查工具ESLint

    前面的话 ESLint是一个JavaScript代码静态检查工具,可以检查JavaScript的语法错误,提示潜在的bug,可以有效提高代码质量,维持前端团队高度一致的编码风格.ESLint不但提供一 ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. Java 8 的 Nashorn 脚本引擎教程

    本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...

  7. Nashorn 在JDK 8中融合Java与JavaScript之力

    从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...

  8. Nashorn——在JDK 8中融合Java与JavaScript之力

      从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript ...

  9. java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api

    移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...

  10. Java 8 Nashorn JavaScript

    转自:https://www.runoob.com/java/java8-nashorn-javascript.html Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Na ...

随机推荐

  1. C# “贝格尔”编排法

    采用“贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边:后一半的数自下而上写在右边,然后用横线把相对的号数连接 ...

  2. jQuery页面滚动图片等元素动态加载实现

    一.关于滚动显屏加载 常常会有这样子的页面,内容很丰富,页面很长,图片较多.比如说光棍节很疯狂的淘宝商城页面. 或者是前段时间写血本买了个高档耳机的京东商城页面,或者是新浪微博之类. 这些页面图片数量 ...

  3. VMware Infrastructure 3 in a Cisco Network Environment

    http://www.cisco.com/en/US/docs/solutions/Enterprise/Data_Center/vmware/VMware.html

  4. 使用com.jayway.jsonpath.JsonPath包进行JSON的快速解析、设置值需要注意的性能提升方法

    一.包地址 1.Maven:http://mvnrepository.com/artifact/com.jayway.jsonpath/json-path <!-- https://mvnrep ...

  5. 〖Android〗快速部署SSHD和Bash Shell(程序:DroidSSHD和BetterTerminalEmulatorPro)

    --此文仅做个人配置记录-- 因为我经常需要sshd来连接设备,它抓取logcat日志太方便了,方便排查问题,及多人共享: 及有USB孔限制的人来说,这个更具有意义: 把超级终端增强包部署到内网,也是 ...

  6. great tips in soapui

    from this site :http://onebyteatatime.wordpress.com/2009/04/18/soapui-tips-n-tricks-part-2/

  7. RRT路径规划算法

    传统的路径规划算法有人工势场法.模糊规则法.遗传算法.神经网络.模拟退火算法.蚁群优化算法等.但这些方法都需要在一个确定的空间内对障碍物进行建模,计算复杂度与机器人自由度呈指数关系,不适合解决多自由度 ...

  8. RHEL7-openldap安装配置一(服务器端安装配置)

    LDAP的术语:entry:一个单独的单元,使用DN(distinguish name)区别attribute:entry的属性,比如,如果entry是组织机构的话,那么它的属性包括地址,电话,传真号 ...

  9. empty、isset、is_null的比较

    直接上代码 <?php $a=0; $b='0'; $c=0.0; $d=''; $e=NULL; $f=array(); $g='\0'; $h=' ';//space $i=true; $j ...

  10. ios中coredata

    http://blog.csdn.net/q199109106q/article/details/8563438 // // MJViewController.m // 数据存储5-Core Data ...