Javascript ==当两个引用都指向同一个对象时,在Nashorn中返回false
下面是一个例子,说明了我面临的问题:Javascript ==当两个引用都指向同一个对象时,在Nashorn中返回false,javascript,java,nashorn,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
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电子邮件别名中有一个关于此的讨论线程:
当您将JavaScript对象传递到外部上下文时,它们会被包装,但这里的问题是Nashorn中的
==
似乎在比较包装器实例,而不是实际的包装对象。如果它看到这是一个ScriptObjectMirror
实例,它应该在比较IMO之前将其打开。除非我遗漏了什么。我接受这个答案,因为Sundar在邮件列表中对此行为提供了很好的解释。