2015-12-21 2 views
7

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

ответ

2

Только на благо других людей, которые могут читать этот вопрос здесь:

Существует обсуждение нить об этом в Насхорн-DEV OpenJDK псевдонима электронной почты: http://mail.openjdk.java.net/pipermail/nashorn-dev/2015-December/005764.html

+0

Я принимаю это как ответ, поскольку Sundar предоставил хорошее объяснение в списке рассылки для такого поведения. –

0

Не уверен, что вы видели документ здесь: (https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes), но в случае, если ваше предположение верно, возможно, вы могли бы использовать «Явное зеркальное отображение объекта сценария», чтобы избежать проблем, которые у вас есть.

+0

JavaScript объекты упаковываются, когда вы проходите их в чужой контекст, но проблема здесь в том, что '===' в Нашборне, кажется, сравнивает экземпляры обертки, а не фактические, обернутые объекты. Если он видит, что это экземпляр ScriptObjectMirror, он должен развернуть его перед сравнением IMO. Если только что-то не хватает. –