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. CSS外框高度自动适应

    当有浮动float时,最外框会不跟随内容的高度而高: 解决办法一:清除浮动  clear:both <!DOCTYPE html> <html xmlns="http:// ...

  2. Linux中Centos7下安装Mysql(更名为Mariadb)

    一.安装: yum install mariadb-server mariadb 二.启动服务: systemctl start mariadb 三.配置大小写敏感问题.和字符为utf8: vim / ...

  3. 再谈IE的浏览器模式和文档模式[转]

    http://www.cnblogs.com/liuzhendong/archive/2012/04/27/2474363.html 以前在 “IE8兼容视图(IE7 mode)与独立IE7的区别”一 ...

  4. python乱码问题之爬虫篇

    UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 167: illegal multibyte sequence 使 ...

  5. SSH协议

    SSH是一种协议,实现计算机之间的加密登录,即使被截获,截获的也只是加密后的密文,不会泄密. 如果每次登录另外一台计算机,都需要输入密码,就显得太麻烦,所以SSH协议实现了无密码登录,即公钥登录.所谓 ...

  6. 算法笔记_221:串的简单处理(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 串的处理在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求程序对用户输入的串进行处理.具体规则如下:1. 把每个单词的首字母变为大 ...

  7. 12 个非常实用的 jQuery 代码片段

    jQuery是一个非常流行而且实用的JavaScript前端框架,本文并不是介绍jQuery的特效动画,而是分享一些平时积累的12个jQuery实用代码片段,希望对你有所帮助. 导航菜单背景切换效果 ...

  8. jquery vue 框架区别

    1.数据和视图分离,解耦 2.以数据驱动视图,只关心数据变化,DOM操作被封装

  9. javascript转换时间戳

    var unixTimestamp = new Date(1513814400000);commonTime = unixTimestamp.toLocaleString();

  10. C++ 的 runtime exception是没有扩展性的

    https://groups.google.com/forum/#!topic/seastar-dev/RuK-OajeqHk https://www.google.com/search?ei=gTH ...