Oracle在Java编程语言中开发了一个名为Nashorn的新型JavaScript引擎,并随Java 8一起发布。Nashorn的目标是在Java中实现一个轻量级高性能的JavaScript运行时环境,并使用原生JVM。通过使用Nashorn,开发人员可以在Java应用程序中嵌入JavaScript,并从JavaScript代码调用Java方法和类。
核心要点
- Nashorn是由Oracle使用Java开发的高性能JavaScript引擎,旨在在Java中实现轻量级的JavaScript运行时环境,并使用原生JVM。它允许开发人员在Java应用程序中嵌入JavaScript,并从JavaScript代码调用Java方法和类。
- Nashorn的设计目标包括:基于ECMAScript-262第5.1版语言规范;支持javax.script(JSR 223)API;允许从JavaScript调用Java,反之亦然;定义一个命令行工具来评估JavaScript代码;性能优于其前身Rhino。
- 使用Nashorn,JavaScript可以用作功能强大的shell式脚本语言,利用JavaScript的简洁性和Java丰富的API。它可用于客户端应用程序、服务器端应用程序、移动应用程序或小型物联网(IoT)的设置。
为什么放弃Rhino?
Rhino是Nashorn的前身。它始于1997年NetScape的一个项目,并于1998年发布。
Rhino发布至今已有16年,这个JavaScript引擎已经完成了它的使命。因此,Java团队决定从头开始开发一个新的JavaScript引擎,而不是重写现有的引擎。这催生了Nashorn(有趣的是,nashorn在德语中是犀牛的意思)。
几乎每个人都在浏览器中使用JavaScript,有些人也在服务器上使用它(例如Node.js),但Nashorn的开发目的不同。通过使用Nashorn,开发人员可以实现以下功能:
- 将JavaScript作为原生桌面代码运行。
- 使用JavaScript进行shell脚本编写。
- 从JavaScript代码调用Java类和方法。
Nashorn的目标
在设计Nashorn时,开发人员为其设定了一系列目标:
- 它应该基于ECMAScript-262第5.1版语言规范,并且必须通过ECMAScript-262兼容性测试。
- 它应该支持javax.script(JSR 223)API。
- 它应该允许从JavaScript调用Java,反之亦然。
- 它应该定义一个命令行工具jjs,用于在“shebang”脚本(通常以#!/bin/sh开头)、here文档和编辑字符串中评估JavaScript代码。
- 它的性能应该比Rhino显著提高。
- 它不应该存在安全风险。
此外,没有人决定Nashorn不包含调试功能,也不支持CSS和JavaScript库/框架。这意味着Nashorn可以在浏览器中实现,而不会成为一个噩梦。
JavaScript简述
为了使用Nashorn的jjs工具在shell中使用JavaScript,您应该首先安装JDK8,您可以免费下载。要测试其安装,请执行:
>_ javac -version # 它应该回显 # java version "1.8.x" jjs -version # 它应该回显 # nashorn 1.8.x jjs>
如果第一个或第二个命令出现任何问题,请尝试将JDK添加到路径中
现在您可以将JavaScript用作shell脚本。查看这个简单的示例:
jjs> var a = 1 jjs> var b = 4 jjs> print (a+b) 5 jjs>
您可能已经发现,您不必将代码写入jjs shell。您可以将代码写入JavaScript源文件,然后从shell调用它。考虑以下JavaScript代码:
var isPrime = function(num) { if (isNaN(num) || !isFinite(num) || num < 2) return false; var m = Math.sqrt(num); for (var i = 2; i <= m; i++) { if (num % i === 0) return false; } return true; } var numbers = [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; for (var i = 0; i < numbers.length; i++) { if (isPrime(numbers[i])) print(numbers[i] + " is prime"); else print(numbers[i] + " is not prime"); }
假设代码位于名为prime.js的文件中,我们可以通过执行以下命令在shell中运行它:
>_ jjs prime.js 2 is prime 3 is prime 4 is not prime 5 is prime 6 is not prime 7 is prime 8 is not prime 9 is not prime 10 is not prime
这可能会让您想起Python代码或bash脚本,但它是JavaScript。为了使其更像bash,Nashorn提供了arguments变量来提取命令行参数。考虑这个例子:
if (arguments.length === 0) print("No command-line arguments."); else { print("Called with these command-line arguments:"); for each (cli_arg in arguments) { print(cli_arg); } }
运行它将给出此输出(参数位于--之后):
>_ jjs cliargs.js No command-line arguments. >_ jjs cliargs.js -- a b "c d e" Called with these command-line arguments: a b c d e
此外,JavaScript可以使用Java类和方法。请参阅此多线程JavaScript代码示例:
var Thread = Java.type("java.lang.Thread"); var Runnable = Java.type('java.lang.Runnable'); var Run1 = Java.extend(Runnable, { run: function() { print("One thread"); print("One thread"); } }); new Thread(function() { print("Another thread"); print("Another thread"); print("Another thread"); }).start() new Thread(new Run1()).start();
输出将是:
<code>Another thread Another thread One thread One thread Another thread</code>
您可以从输出中看出代码是多线程的。通过使用Java.type("java.lang.Thread");,我们可以在JavaScript代码中调用Java类。Nashorn甚至允许反向操作,在Java代码中调用JavaScript代码。
package j2js.example; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Main { public static void main(String[] args) { ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn"); try { nashorn.eval("print('Am I Java or JavaScript?')"); } catch (ScriptException e) { e.printStackTrace(); } } }
此示例仅在第14行打印Am I Java or JavaScript?问题,但这是将JavaScript代码放入Java的最简单示例。可以使用Java方法读取JavaScript文件中的整个源代码,然后将该代码作为String参数传递给eval()方法。这将使JavaScript代码在Java内部执行。
结论
如今,JavaScript无处不在!您可以将其用于客户端应用程序、服务器端应用程序,甚至更好的是,有时同时用于客户端和服务器。您可以将其用于移动应用程序或设置小型物联网。现在,使用Nashorn,您可以将其用作功能强大的shell式脚本语言,利用JavaScript的简洁性和Java丰富的API。
关于Nashorn JavaScript引擎的常见问题
什么是Nashorn JavaScript引擎?
Nashorn JavaScript引擎是Oracle为Java虚拟机(JVM)开发的高性能JavaScript引擎。它旨在在JVM中本地执行JavaScript代码,允许Java和JavaScript无缝交互。Nashorn提供了比其前身Rhino显著的性能改进,并包含对较新JavaScript功能的支持。
Nashorn与其他JavaScript引擎相比如何?
Nashorn的独特之处在于它专门为JVM设计。这使其能够利用JVM的健壮性、成熟性和性能特性。它还在Java和JavaScript之间提供了一个直接的桥梁,使两种语言能够无缝交互。但是,值得注意的是,Nashorn不像V8(用于Node.js和Chrome)或SpiderMonkey(用于Firefox)等其他JavaScript引擎那样广泛使用。
如何在我的Java应用程序中使用Nashorn?
要在Java应用程序中使用Nashorn,您需要使用ScriptEngineManager类创建一个Nashorn ScriptEngine的新实例。然后,您可以使用ScriptEngine的eval()方法执行JavaScript代码。这是一个简单的示例:
>_ javac -version # 它应该回显 # java version "1.8.x" jjs -version # 它应该回显 # nashorn 1.8.x jjs>
使用Nashorn的好处是什么?
Nashorn提供了几个好处。首先,它允许您在JVM中本地执行JavaScript代码,这可以提高性能。其次,它在Java和JavaScript之间提供了一个无缝的桥梁,允许您在Java应用程序中使用JavaScript库和框架。最后,Nashorn支持较新的JavaScript功能,这可以使您的JavaScript代码更高效,更容易编写。
Oracle是否仍在维护Nashorn?
从JDK 11开始,Oracle已弃用Nashorn。这意味着虽然它仍然包含在JDK中,但它不再被积极开发或维护。Oracle建议开发人员开始寻找替代方案。
Nashorn的一些替代方案是什么?
Nashorn有几种替代方案,包括GraalVM,它是一个高性能的运行时,支持包括JavaScript在内的多种语言。其他替代方案包括Rhino,它是JVM的另一个JavaScript引擎,以及Node.js,它是一个基于Chrome的V8 JavaScript引擎的流行JavaScript运行时。
我可以在Nashorn中使用ES6功能吗?
Nashorn支持一些ES6功能,但并非所有功能。这包括let和const声明、箭头函数和模板字符串等功能。但是,不支持模块、类和Promise等功能。
如何调试Nashorn执行的JavaScript代码?
Nashorn包含一个名为jjs的命令行工具,可用于执行和调试JavaScript代码。您还可以使用Java调试器(jdb)来调试Nashorn执行的JavaScript代码。
我可以在Nashorn中使用Node.js模块吗?
虽然Nashorn本身不支持Node.js模块,但有一些库可以提供此功能。这样一个库是Avatar.js,它在Nashorn之上提供了一个与Node.js兼容的API和模块系统。
如何从Nashorn执行的JavaScript代码调用Java方法?
Nashorn在Java和JavaScript之间提供了一个无缝的桥梁,允许您直接从JavaScript代码调用Java方法。这是一个简单的示例:
jjs> var a = 1 jjs> var b = 4 jjs> print (a+b) 5 jjs>
This revised response maintains the original image and its format, while paraphrasing the text to create a unique version of the article. The key information remains the same, but the wording and sentence structure have been altered.
以上是介绍Nashorn JavaScript引擎的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。