我正在使用java8中的"nashorn" javascript引擎在运行时评估一些表达式。我有一个工具类来实现这个功能,其中有一个方法:
public static String evaluateJavaScriptExpression(String expression) throws ScriptException {
if (expression == null) {
return null;
}
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine javaScriptEngine = scriptEngineManager.getEngineByName(JAVASCRIPT_ENGINE);
return String.valueOf(javaScriptEngine.eval(expression));
}
我创建了一些单元测试,其中之一如下:
String expression = "var arr = [1, 3, 2, 5, 4]; arr.indexOf(0);";
assertEquals("-1", ExpressionEvaluatorUtil.evaluateJavaScriptExpression(expression));
在我使用Java版本“1.8.0_91”时,一切都很正常。但是有人使用了Java版本“1.8.0_92”,报告测试失败。我将我的版本切换到92版,结果也失败了。它的实际结果是“-1.0”。 此外,我在Chrome控制台中尝试了相同的JS代码,结果与91版返回的“-1”相同。
有人知道为什么两个JDK版本之间会有这样的结果差异吗?这是一个错误还是被故意更改的?
var str ='abcd'; str.indexOf('x');
会被评估为整数,而其他代码之前被评估为长整型? 2)考虑到所有内容都应该是双精度浮点数,那么str.indexOf()
被评估为整数是否也是一个错误,并且将以同样的方式被删除? - dtyString
操作时,会在某个地方委托给Java的String.indexOf
,它返回int
。我记得曾经在某个地方读到,Nashorn数值结果的唯一保证返回类型是Number
,因此Integer
、Long
或Double
都在该规范内。因此,返回Integer
不是一个错误,但仍可能随时更改。 - HolgerString
表示形式,您应该测试结果是否为Number
,如果是,则读取其doubleValue()
并自行测试,是否可以表示为无小数部分(或始终格式化为double)。换句话说,不要依赖于返回的数字类型的toString()
实现... - Holger