2015-05-29 65 views
4

传递未定义犀牛的Javascript我需要从斯卡拉/ Java的在斯卡拉/ Java的

function hello(a, b) { 
    return a+b; 
} 

我做了这个基本的代码评估在Javascript中这样的功能:

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)) 
} 

为参数I” m传递一个null,我得到一个1.0作为结果。如果我侵入我的JavaScript(我不想做这个),我做到了:

function hello(a, b) { 
    if (a === null) { 
     a = undefined; 
    } 
    return a+b; 
} 

我得到预期的NaN。

正确的解决方案是将一个undefined传递给invokeFunction: 我该怎么做?

+0

我不知道犀牛,但会'Double.NaN'工作? –

+0

没有一个满意的答案相关的问题:http://stackoverflow.com/q/29277606/86485 –

回答

3

ScriptEngine.eval将undefined转换为null - 因为在Java中没有未定义的概念。 (为什么?)如果你想获得内部犀牛未定义的对象,并通过它,你可以做这样的事情:

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; 
    } 
} 
+0

**为什么通过未定义?** 假设你调用一个现有的JavaScript库(像lesscss),调用这样的东西.. 。 'var variables = options.variables; (typeof variables ==='object'){/ *记住typeof null ==='object'*/ var keys = Object.keys(variables);/* error'null is a Object'*/ }' '现在来看看,'options'是AbstractJSObject的一个实现......您将如何在getMember中指定该成员不存在,返回null throws一个错误。 – xer21