在Scala / Java中将undefined传递给Nashorn Javascript
发布时间:2020-12-16 10:00:02 所属栏目:安全 来源:网络整理
导读:我需要在 Scala / Java的 Javascript中评估这个函数 function hello(a,b) { return a+b;} 我做了这个基本代码: val factory = new ScriptEngineManager(null)val engine = factory.getEngineByName("JavaScript")val body = """ |function hello(a,b) { | r
我需要在
Scala /
Java的
Javascript中评估这个函数
function hello(a,b) { return a+b; } 我做了这个基本代码: val factory = new ScriptEngineManager(null) val engine = factory.getEngineByName("JavaScript") val body = """ |function hello(a,b) { | return a+b; |} """.stripMargin engine match { case engine: Invocable => engine.eval(body) println(engine.invokeFunction("hello",null,1: java.lang.Double)) } 对于参数a我传递的是null,结果得到1.0.如果我破解了我的javascript(我不想做到这一点)而且我做到了: function hello(a,b) { if (a === null) { a = undefined; } return a+b; } 我得到了预期的NaN. 正确的解决方案是将undefined传递给invokeFunction: 解决方法
ScriptEngine.eval将undefined转换为null – 因为Java中没有undefined的概念.如果你想获得内部的nashorn undefined对象并传递它(为什么?),你可以这样做:
import javax.script.*; public class Test { private static Object undefined; public static void main(String[] args) throws Exception { ScriptEngineManager m = new ScriptEngineManager(); ScriptEngine e = m.getEngineByName("nashorn"); e.eval("Packages.Test.setUndefined(undefined)"); e.eval("function func(a,b) { return a + b; }"); Object val = ((Invocable)e).invokeFunction("func",undefined,44); if (val instanceof Double && ((Double)val).isNaN()) { System.out.println("got NaN as expected"); } } public static void setUndefined(Object obj) { undefined = obj; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |