Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ==当两个引用都指向同一个对象时,在Nashorn中返回false_Javascript_Java_Nashorn - Fatal编程技术网

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在邮件列表中对此行为提供了很好的解释。