加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读