2015-12-21 45 views
7

以下是一个演示,我所面临的问题的例子:===在犀牛返回false当两个引用应指向同一个对象

ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
    new String[] { "-strict" } 
); 

try { 
    engine.eval("function Foo(src) { this.src = src }; var e = { x: new Foo(\"what\") };"); 

    ScriptContext c = new SimpleScriptContext(); 
    c.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); 
    c.getBindings(ScriptContext.ENGINE_SCOPE).putAll(engine.getBindings(ScriptContext.ENGINE_SCOPE)); 

    System.out.println(engine.eval("var z = e.x; z === e.x;", c)); 
} catch(Exception e) { 
    throw new RuntimeException(e); 
} 

我知道,在另一个上下文中实例化的对象,被认为是“外国”,最终被一个ScriptObjectMirror实例包裹。我认为这就是为什么我在这里遇到问题。我相信无论何时取消x,都会创建一个新的ScriptObjectMirror实例;这可以解释下面的代码位的唯一的事也返回false

System.out.println(engine.eval("e.x === e.x;", c)); 

有没有办法解决?我正在寻找一些我可以从Java做的事情,可能会以某种方式设置上下文/绑定,而不必为了解决这个问题而使用JavaScript编写代码。

回答

0

不知道你是否看过这里的文档:(https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes)但如果你的假设是正确的,也许你可以使用'显式脚本对象镜像环绕'来避免你有问题。

+0

当你通过他们的JavaScript对象都包裹到外国的背景下,但这里的问题是,Nashorn中的'==='似乎在比较包装器实例而不是实际的包装对象。如果它看到的是一个'ScriptObjectMirror'实例,它应该在比较IMO之前解开它。除非有什么我失踪。 –