当两个引用都指向同一个对象时,===在Nashorn中返回false

时间:2015-12-21 22:55:38

标签: javascript java nashorn

这是一个展示我面临的问题的例子:

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编写代码来解决这个问题。

2 个答案:

答案 0 :(得分:2)

只是为了其他可能正在阅读此问题的人的利益:

在nashorn-dev openjdk电子邮件别名中有一个讨论主题:  http://mail.openjdk.java.net/pipermail/nashorn-dev/2015-December/005764.html

答案 1 :(得分:0)

不确定您是否在此处看过该文档:(https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes)但是如果您的假设是正确的,也许您可​​以使用“显式脚本对象镜像包装”来避免您遇到的问题。