【问题标题】:=== returns false in Nashorn when both references should be pointing to the same object当两个引用都指向同一个对象时,=== 在 Nashorn 中返回 false
【发布时间】:2015-12-21 22:55:37
【问题描述】:

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

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

【问题讨论】:

    标签: javascript java nashorn


    【解决方案1】:

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

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

    【讨论】:

    • 我接受这个作为答案,因为 Sundar 在邮件列表中为这种行为提供了很好的解释。
    【解决方案2】:

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

    【讨论】:

    • JavaScript 对象在您将它们传递到外部上下文时被包装,但这里的问题是 Nashorn 中的 === 似乎在比较包装器实例而不是实际的包装对象。如果它看到这是一个 ScriptObjectMirror 实例,它应该在比较 IMO 之前解开它。除非我缺少什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2013-07-09
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多