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. Server Performance Advisor (SPA) 3.0

    http://blogs.technet.com/b/windows-server-china-blog/archive/2013/03/26/server-performance-advisor-s ...

  2. Python-统计svn代码总行数

    1 #!/bin/bash/python 2 # -*-coding:utf-8-*- 3 #svn统计url代码行数脚本,过滤空行,不过滤注释. 4 5 import subprocess,os,s ...

  3. Configutation读取properties文件信息

    commons configuration可以很方便的访问配置文件和xml文件中的的内容.Commons Configuration 是为了提供对属性文件.XML文件.JNDI资源.来自JDBC Da ...

  4. ld链接器的工作原理及链接顺序(转)

    基礎知識 GNU ld 最基本的連結單位是 object 檔,即單一個編譯單元所對應的編譯結果,通常副檔名是 .o.在 object 檔所維護的資訊當中,連結器主要關注的是: 輸出符號: 這是定義在 ...

  5. java 将数字转成成16进制

      java 将数字转成成16进制 CreationTime--2018年6月11日17点11分 Author:Marydon 1.前提 数字必须是byte类型,即[-128,127] 2.代码实现 ...

  6. .net通过url访问服务器获取服务器返回数据

    一.url为http协议 1.普通调用: public string GetInfo(string url) { //访问http方法 string strBuff = ""; U ...

  7. js和html插件集

    1.UEditor编辑器 UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码... 2.echar ...

  8. ssm(spring mvc+mybatis)+netty4开发qiq

    发布时间:2018-10-30   技术:spring mvc+mybatis+nett4+layui   概述 简单快捷的IM方案,快速打造在线IM,可用于公司内网.外网通讯,客服系统等,实现了so ...

  9. 使用PHP做移动端 api接口开发方法(适用于TP框架)

    1. [代码]使用TP框架时 放在common文件夹下文件名就叫function.php ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  10. 阿里云ecs配置辅助网卡绑定公网ip地址

    EIP直通车 前置条件:1.大家的实例是从经典迁移到VPC里面的,上古时期,经典实例大家购买实例的时候都是买了带宽的.而这种带宽一般情况下都是包年包月的,而且这种绑定在实例上的IP,我们把它叫做公网I ...