Java Nashorn--Part 6。本站提示廣大學習愛好者:(Java Nashorn--Part 6)文章只能為提供參考,不一定能成為您想要的結果。以下是Java Nashorn--Part 6正文
正如我們所討論的,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 裡一切元素的屬性和值)。