Вот пример, который демонстрирует проблему я обращенную:=== возвращает ложь в 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 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, чтобы обойти это.
Я принимаю это как ответ, поскольку Sundar предоставил хорошее объяснение в списке рассылки для такого поведения. –