【问题标题】:Basic JS object {a:1,b:2} not supported in Nashorn?Nashorn 不支持基本 JS 对象 {a:1,b:2}?
【发布时间】:2019-08-07 10:48:27
【问题描述】:

在 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.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470) 的第 6 列第 1 行 在 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)

有什么想法吗?

【问题讨论】:

    标签: javascript java java-8 nashorn


    【解决方案1】:

    假设此功能类似于 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)
    

    【讨论】:

    • 是的,所有这些都是真的。我真正的用例是评估此代码以构建一个带有键 a 和 b 以及值(分别)1和 2 的 Map ......这看起来很复杂,没有像 eval("var obj = {a:1 ,b:2}")
    • @richetyann 你打算如何使用创建的对象字面量?要使用该对象,您需要将其分配给某个变量。我已经在答案中解释过,eval("{a:1,b:2}") 创建了带标签的语句。不是对象字面量。
    • 不是真的,事实上我可以在调用 ((ScriptObjectMirror) o).to(Map.class) 之后将评估的对象用作 Map
    【解决方案2】:

    感谢adiga,使用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多