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

=== returns false in Nashorn when both references should be pointing to the same object

本文关键字:一个对象 false 返回 Nashorn 两个 引用      更新时间:2023-09-26

下面是一个示例,演示了我面临的问题:

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编写代码来绕过这一点。

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

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

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