=== returns 在 Nashorn 中当两个引用应该指向同一个对象时为 false
=== returns false in Nashorn when both references should be pointing to the same object
这是一个演示我面临的问题的例子:
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);
}
我知道在另一个上下文中实例化的对象被认为是 "foreign" 并最终被 ScriptObjectMirror
实例包装。我假设这就是我 运行 在这里遇到问题的原因。我相信每当取消引用 x
时,都会创建一个新的 ScriptObjectMirror
实例;这是唯一可以解释以下代码也返回 false
:
的原因
System.out.println(engine.eval("e.x === e.x;", c));
有办法解决这个问题吗?我正在寻找我可以从 Java 做的事情,也许可以以某种方式设置 contexts/bindings 而不必在 Java 脚本中编写代码来解决这个问题。
不确定您是否看过此处的文档:(https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes) 但如果您的假设是正确的,也许您可以使用 'Explicit script object mirror wrapping' 来避免您遇到的问题。
只是为了可能正在此处阅读此问题的其他人的利益:
在 nashorn-dev openjdk 电子邮件别名中有一个讨论主题:
http://mail.openjdk.java.net/pipermail/nashorn-dev/2015-December/005764.html
这是一个演示我面临的问题的例子:
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);
}
我知道在另一个上下文中实例化的对象被认为是 "foreign" 并最终被 ScriptObjectMirror
实例包装。我假设这就是我 运行 在这里遇到问题的原因。我相信每当取消引用 x
时,都会创建一个新的 ScriptObjectMirror
实例;这是唯一可以解释以下代码也返回 false
:
System.out.println(engine.eval("e.x === e.x;", c));
有办法解决这个问题吗?我正在寻找我可以从 Java 做的事情,也许可以以某种方式设置 contexts/bindings 而不必在 Java 脚本中编写代码来解决这个问题。
不确定您是否看过此处的文档:(https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes) 但如果您的假设是正确的,也许您可以使用 'Explicit script object mirror wrapping' 来避免您遇到的问题。
只是为了可能正在此处阅读此问题的其他人的利益:
在 nashorn-dev openjdk 电子邮件别名中有一个讨论主题: http://mail.openjdk.java.net/pipermail/nashorn-dev/2015-December/005764.html