Базовый объект JS {a: 1, b: 2} не поддерживается в Nashorn? - PullRequest
2 голосов
/ 16 марта 2019

Я был немного удивлен, когда выдвинул исключение с помощью этого простого выражения в Nashorn (JDK8 от Oracle, последняя версия):

ScriptEngineManager manager = new ScriptEngineManager();
engine = manager.getEngineByName("js");
engine.eval("{a:1,b:2}");

Что дает

javax.script.ScriptException:: 1: 6 Ожидается; но нашел: {А: 1, б: 2}; ^ в строке № 1 в столбце № 6 в jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException (NashornScriptEngine.java:470) в jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl (NashornScriptEngine.java:537) в jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl (NashornScriptEngine.java:524) в jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl (NashornScriptEngine.java:402) в jdk.nashorn.api.scripting.NashornScriptEngine.eval (NashornScriptEngine.java:155) в javax.script.AbstractScriptEngine.eval (AbstractScriptEngine.java:264)

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Предполагая, что эта функциональность аналогична javascript eval, вы получаете эту ошибку, потому что eval("{a:1,b:2}") оценивает {} как блок кода, а не как литерал объекта.

eval("{a:1,b:2}")

Этот код эквивалентен:

{
  a: 1,
  b: 2
}

Ошибка выдается в строке b: 2. Здесь a становится оператором с пометкой в новом блоке {}. Итак, если бы вы создали литерал объекта только с одним свойством, это сработало бы.

eval("{a:1}") // no errors

Если вам нужен литерал объекта, присвойте его переменной

eval("var obj = {a:1,b:2}")
console.log(obj)
0 голосов
/ 16 марта 2019

Благодаря adiga, использование

ScriptEngineManager manager = new ScriptEngineManager();
engine = manager.getEngineByName("js");
engine.eval("({a:1,b:2})");

решило мою проблему.(Обратите внимание на круглые скобки, которые отключают «блок кода»)

...