Nashorn不支持基本JS对象{a:1,b:2}?

问题描述 投票:2回答:2

在Nashorn(来自Oracle的JDK8,最新)中使用这个简单的表达式引发异常时,我有点意外:

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

这使

javax.script.ScriptException :: 1:6预期;但发现:{a:1,b:2};在jdk的jdk.nashorn.api.sappting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:537)的第6列第1行第1行.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:524)at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine) .java:155)at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)

任何的想法 ?

javascript java java-8 nashorn
2个回答
2
投票

假设此功能类似于javascript eval,您将收到此错误,因为eval("{a:1,b:2}"){}评估为代码块而不是对象文字。

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

该代码相当于:

{
  a: 1,
  b: 2
}

错误是在b: 2线上引发的。在这里,a成为新的labeled statement区块内的{}。所以,如果你只用一个属性创建了一个对象文字,那就行了。

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

如果需要对象文字,则将其分配给变量

eval("var obj = {a:1,b:2}")
console.log(obj)

0
投票

感谢adiga,使用

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

解决了我的问题。 (注意禁用“代码块”的括号)

© www.soinside.com 2019 - 2024. All rights reserved.